Avatar billede Slettet bruger
09. maj 2009 - 12:13 Der er 8 kommentarer og
1 løsning

Avanceret fil-upload i php - livstid på filerne.

Jeg er ved at skrive en forholdsvis simpel webshop, og er forholdsvis nybegynder hvad php angår. På denne webshop er der en bestillingsform hvor man skal kunne uploade 3 billeder. Det i sig selv er ikke noget problem.
- Når man har udfyldt bestillingsformen, bliver produktet lagt i en indkøbskurv (informationen om ordren gemmes i en session).
- Når man er færdig med at tilføje varer og færdiggører ordren bliver al informationen sendt som mail til mig.

Problemet er som følger:
Hvis kunden ikke færdigører bestillingen hvordan undgår jeg så at billedfilerne bliver gemt (her går jeg ud fra at jeg, når man er færdig med at udfylde bestillingsformen, bliver nød til at gemme filerne på serveren for at de ikke bliver slettet når man går til en ny side?)?

Hvis jeg ikke har udtrykket mig klart nok så bare spørg.
Avatar billede showsource Seniormester
09. maj 2009 - 14:51 #1
Jeg forstår ikke hvorfor man skal uploade når man vil bestille ?
Avatar billede Slettet bruger
09. maj 2009 - 15:44 #2
Det er fordi det man bestiller er costum made klistermærker hvor man kan få sine egne logoer på.
Avatar billede arne_v Ekspert
10. maj 2009 - 04:39 #3
Den simple løsning er at gemme filnavnet i en tabel files_to_be_deleted og slette filnavnet derfra når ordren er endelig afgivet - og så periodisk rydde op.

De mere avancerede løsning er at lave en session handler, gemme filnavn i session sammen med de andre oplysnibger og ved session destroy så slette filen (igen forudsat at ordren ikke gennemført).
Avatar billede Slettet bruger
12. maj 2009 - 19:09 #4
Se, det lyder jo spændende det du snakker om der.
For mig lyder det som om at der ved løsning 1 stadig vil ligge filer tilbage på serveren hvis kunden forlader siden??
Hvorimod den anden sletter filerne når session'en bliver afbrudt?
Avatar billede arne_v Ekspert
12. maj 2009 - 19:33 #5
Ved den foerste loesning bliver filerne slettet hver X. time, naar du koerer et oprydnings script.
Avatar billede Slettet bruger
12. maj 2009 - 20:17 #6
Ja, og det var det jeg helst var fri for. Tror der kommer til at være nogle problemer med hvornår scriptet skal køre i forhold til flere brugere på samme tid.

Så spørgsmålet lyder måske i virkeligheden: hvordan laver jeg en session handler hvor filerne bliver slettet ligesom session-variabler bliver nulstillet når siden forlades??
Avatar billede arne_v Ekspert
17. maj 2009 - 21:41 #7
Jeg håber at du er kvartgod til PHP !

:-)

Demo kode:

<?php

function delete_file($S) {
    if(isset($S['filnavn'])) {
        $fnm = $S['filnavn'];
        @unlink($fnm);
    }
}

require('session_hook.php');

set_session_destroy_hook('delete_file');

session_start();

$_SESSION['filnavn'] = 'C:\foobar.dat';

echo "OK";

?>

hvor session_hook.php ser ud som:

<?php

// sligthly modified version of code from http://www.php.net/manual/en/function.session-set-save-handler.php

$hook = '';
$sess_save_path = session_save_path();

function special_session_decode($session_string){
    $current_session = session_encode();
    foreach ($_SESSION as $key => $value){
        unset($_SESSION[$key]);
    }
    session_decode($session_string);
    $restored_session = $_SESSION;
    foreach ($_SESSION as $key => $value){
        unset($_SESSION[$key]);
    }
    session_decode($current_session);
    return $restored_session;
}

function open($save_path, $session_name) {
    global $sess_save_path;
    $sess_save_path = $save_path;
    return true;
}

function close() {
    return true;
}

function read($id) {
    global $sess_save_path;
    $sess_file = "$sess_save_path/sess_$id";
    return (string) @file_get_contents($sess_file);
}

function write($id, $sess_data) {
    global $sess_save_path;
    $sess_file = "$sess_save_path/sess_$id";
    if ($fp = @fopen($sess_file, "w")) {
        $return = @fwrite($fp, $sess_data);
        fclose($fp);
        return $return;
    } else {
        return false;
    }
}

function destroy($id) {
    global $hook;
    $hook(special_session_decode(read($id)));
    global $sess_save_path;
    $sess_file = "$sess_save_path/sess_$id";
    return @unlink($sess_file);
}

function gc($maxlifetime) {
    global $sess_save_path;
    foreach (glob("$sess_save_path/sess_*") as $filename) {
        global $hook;
        $hook(special_session_decode(@file_get_contents($filename)));
        if (filemtime($filename) + $maxlifetime < time()) {
            @unlink($filename);
        }
    }
    return true;
}

function set_session_destroy_hook($callback) {
    global $hook;
    $hook = $callback;
    session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');
}

?>
Avatar billede Slettet bruger
18. maj 2009 - 22:58 #8
Mange tak for 'demokoden', har lige kastet et blik på den og tror jeg forstår hvordan den virker overordnet. Da jeg skal ud og rejse de næste par måneder når jeg nok ikke lige at få prøvet koden af i praksis. Men vender stærkt tilbage når jeg kommer hjem.
Avatar billede arne_v Ekspert
04. juli 2009 - 04:28 #9
Jeg smider et svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester