unlink bestand na download

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Senior, Medior and Junior SAP HANA Developer

Vacature details Vakgebied: Software/IT Opleiding: Medior Werklocatie: Veldhoven Vacature ID: 12696 Introductie Our client is the world's leading provider of lithography systems for the semiconductor industry, manufacturing complex machines that are critical to the production of integrated circuits or chips. Our purpose is “unlocking the potential of people and society by pushing technology to new limits”. We do this guided by the principles “Challenge”, “Collaborate” and “Care”. Wat verwachten we van jou? SAP Certified Application Associate - SAP HANA Cloud Modeling (training and/or certification) Bachelor degree or higher Excellent understanding of SAP HANA (2.0 / Cloud), Data Modelling and writing

Bekijk vacature »

Ah c

ah c

14/11/2013 21:11:57
Quote Anchor link
hallo forummers,
Ik had het volgende script van SanThe gekregen,

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
{

    if(isset($_POST['password']))
    {

        if(md5($_POST['password']) == md5("uwpassword"))
        {

            header("Location: labeltjes.zip");
        }

        else
        {
            echo "Fout! De door u ingevoerde code is niet juist";
        }
    }
}

else
{
    echo 'Geen code ingevuld.';
}

?>


Later ben ik aan het stoeien geweest om als de gebruiker het bestand heeft gedownload (uiteraard na correcte ingave van het password), dat de betreffende file automatisch zou worden gewist. Nu weet ik dat
je met unlink de file kan deleten, maar hoe dit verder toe te passen in bovenstaande code is voor mij "even niet weten". M.a.w. de gebruiker mag maar éénmaal het password ingeven, downloaden en dan moet onmiddelijk na het downloaden het bestand gewist worden.
Wie kan hier de aanvulling op maken of mij een beetje sturen.

na de regel echo 'Geen code ingevuld.';
had ik het volgende bedacht,

continue;
}
$file = ("labeltjes.zip");

if (file_exists($file)) {

} unlink($file);

maar dit werkt in z'n geheel niet.
 
PHP hulp

PHP hulp

23/12/2024 05:10:41
 
- Ariën  -
Beheerder

- Ariën -

14/11/2013 21:16:27
Quote Anchor link
Je wilt hem ook niet direct wissen namelijk. Is een wachttijd van een bepaald aantal uur niet een beter idee?
Anders moet je de download via een PHP-script serveren die eerst controleert of je hem nog mag downloaden, en zo ja deze met readfile() binnenhaalt.
Dan kan je hem markeren als gedownloadt, en kan je de link ongedaan maken. Als beveiliging zou je je bestaande en gebruikte IP voor de download nog voor 24 uur toegang geven....
Gewijzigd op 14/11/2013 21:41:20 door - Ariën -
 
Ah c

ah c

14/11/2013 21:40:49
Quote Anchor link
hallo Aar,
Het is echt noodzakelijk dat het bestand na download onmiddelijk gewist wordt. Er mag geen seconde wachttijd tussen zitten. Er zal wel eerst gecontroleerd moeten worden door het script op een of andere manier of het bestand inderdaad gedownload is. Zo ja, dan bestand gelijk wissen.
 
- Ariën  -
Beheerder

- Ariën -

14/11/2013 21:42:08
Quote Anchor link
Zie mijn vorige post, heb ik net nog even uitgebreid.
Een controle of iets gedownload is gaat volgens mij met PHP niet lukken. Of je moet controleren of hij opgevraagd is.
 
Ah c

ah c

14/11/2013 22:19:56
Quote Anchor link
Aar,
Het is een bestand wat aangekocht moet worden op de website, zodra gebruiker heeft betaald, dan zend ik de gebruiker een email met daarin een password. Wat die gebruiker met dat password gaat doen kan je wel raden.
Het is echter wel de bedoeling dat die gebruiker éénmaal de kans krijgt om het bestand te downloaden.
Dat het script moet controleren of het bestand gedownload (opgevraagd) is is een goed voorstel, maar hoe dit te realiseren weet ik niet. Maar als het te doen is, die controle als het bestand is opgevraagd, dan moet direct daarna het bestand wel verwijderd worden. Misschien is het mogelijk om een soort van een "FLAG" op het bestand te zetten,en dan met een bepaalde code in het script het bestand te verwijderen.
Ikke nie wete. Maar als het echt niet mogelijk is houdt alles op.
 
- SanThe -

- SanThe -

14/11/2013 22:32:50
Quote Anchor link
Het beste lijkt mij het bestand buiten de webroot zetten.
In een database bijhouden welke passwords het mogen downloaden.
Bij het juiste password het bestand inlezen zoals Aar zegt en dan dat bewuste password markeren als klaar.
Hoef je niks te unlinken.
 
- Ariën  -
Beheerder

- Ariën -

14/11/2013 22:37:57
Quote Anchor link
Maar houd wel rekening dat een download kan mislukken, dus log het eerste IP (of userID) die gebruikt wordt voor de eerste download, en laat diegene dan nog een bepaalde tijd vanaf dat IP de download kunnen doen.
 
Ah c

ah c

14/11/2013 22:46:16
Quote Anchor link
SanThe,
Ik was ook van plan om het bestand buiten de root te zetten. Maar om een password te markeren als "klaar" is voor mij even andere koek. Als ik daarmee dan ook het bestand niet hoeft te unlinken mag dat uiteraard ook.
Maar dan is mijn vraag, hoe doe je dat, het markeren van het password in het script?
 
- Ariën  -
Beheerder

- Ariën -

14/11/2013 22:48:55
Quote Anchor link
In een databaseveld 'completed' een 1 plaatsen als het PHP-bestand is aangeroepen.
Gewijzigd op 14/11/2013 22:49:07 door - Ariën -
 
- SanThe -

- SanThe -

14/11/2013 22:52:33
Quote Anchor link
In een database bijhouden.
 
Ah c

ah c

14/11/2013 23:16:17
Quote Anchor link
Okay, I get it. Gaat het hier om een bepaalde Database bv Acces? Anders begrijp ik het niet.
Dan denk ik dat mijn vraag niet op te lossen is met een php code, zoals aangegeven door Aar. Jammer dat er geen methode is om automatisch te controleren of je bestand gedownload is.
Mensen hartelijk bedankt voor jullie antwoorden en suggesties.
Hear you next time.
ahc,
 
Reshad F

Reshad F

14/11/2013 23:28:06
Quote Anchor link
Dat komt omdat PHP een server side language is welke alleen draait tijdens een request.. hij houdt niks bij buiten die ene request om.
 
- Ariën  -
Beheerder

- Ariën -

14/11/2013 23:29:47
Quote Anchor link
En verder wordt er in het algemeen een MySQL-database gebruikt. Bij voorkeur met de mysqli (improvement)-functies.
 
Ward van der Put
Moderator

Ward van der Put

15/11/2013 09:09:58
Quote Anchor link
Bedenk ook even hoe een redirect werkt. Binnen een fractie van een seconde gebeurt dit:

1. Met header("Location: labeltjes.zip"); verwijs je de client door naar de download.

2. Je verwijdert de download.

3. De client keert terug naar de opgegeven Location, maar de download is daar verdwenen.

Je kunt het wel oplossen zonder database. Voer dan een redirect uit naar een download.php laat dat PHP-script vervolgens de download lezen met readfile() en daarna verwijderen met unlink():

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
// Pad en bestandsnaam van de download
$bestand = '/geheim/pad/naar/geheime-bestandsnaam.zip';

// Controleren of het bestand nog bestaat
if (file_exists($bestand)) {
    // Headers toevoegen voor het forceren van een download
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($bestand));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($bestand));
    ob_clean();
    flush();
    // Bestand lezen en doorgeven
    readfile($bestand);
    // Even wachten
    sleep(5);
    // Bestand verwijderen
    unlink($bestand);
    // Einde oefening
    exit;
}
else {
    // De download is verdwenen.  Voer hier een redirect uit
    // of meldt gewoon dat de download weg is.

    header('HTTP/1.1 410 Gone');
}

?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.