[PHP] Uploaden van meerdere files

Pagina: 1
Acties:
  • 480 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor een script wil ik de gebruiker in staat stellen om files te uploaden naar een server.

Een basis scriptje dus...

Maar nu komt de moeilijkheid:

De gebruiker moet in staat zijn om meerdere files naar de server te uploaden. En dit hoeft niet in één keer opgegeven worden.
Ik heb dus een form met hierin een veld waarin het te uploaden bestand geselecteerd kan worden. Na het verzenden van dit bestand komt hetzelfde form weer terug om de gebruiker het volgende bestand te laten uploaden.

Het probleem is echter dat ik de files pas echt op de server wil zetten als de gebruiker klaar is en op de definitieve "Bevestigen" knop heeft geklikt.

Mijn inziens zijn er een paar mogelijkheden om dit te bereiken. Ik kan de files tijdelijk in een temp-map op de server zetten en deze verplaatsen naar de definitieve map. Maar als de gebruiker de site verlaat zonder te bevestigen hou ik die files op de server en zou ik scriptjes moeten gaan draaien om die map op de server zo nu en dan op te schonen. Om problemen te voorkomen doe ik dat liever niet.

Daarom dacht ik slim te zijn. Bij het uploaden van de files plaats ik de files nog nergens. Ik onthoud de $_FILES[file][tmp_name] en $_FILES[file][name] in de sessie en pas na het bevestigen haal ik de bestanden op. Dit werkt echter niet. De variabelen staan wel in de sessie, maar volgens mij bestaan de bestanden niet meer.

Heeft iemand een slimme suggestie om eea wel aan de praat te krijgen?

(Hier wat code om een indruk te krijgen, er is hier nog niets gedaan aan afvangen van fouten etc.)

PHP:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
session_start();

$task = $_REQUEST['task'];

switch($task) {
   case 'store':
      // Gebruiker is klaar met uploaden,
      // nu dus alle files definitef wegschrijven

      $target_path = "uploads/";

      for ($i=0; $i<sizeof($_SESSION['list']); $i++) {
         $target_path = $target_path . basename($_SESSION['list'][$i]['name']);

         if(move_uploaded_file($_SESSION['list'][$i]['tmp_name'], $target_path)) {
            echo "The file " . basename($_SESSION['list'][$i]['name']) . " has been uploaded";
         }
         else {
            // alle variabelen blijken te bestaan
            echo "Error uploading the file " . basename($_SESSION['list'][$i]['name']) .", please try again!<br />";
            echo "target:" . $target_path . " en tmpname " . $_SESSION['list'][$i]['tmp_name'] ."<br/>";
         }
      }
      break;

   case 'addItem':
      // File toevoegen aan lijst met bestanden

      $data = array();
      $data['tmp_name'] = $_FILES['upload']['tmp_name'];
      $data['name'] = $_FILES['upload']['name'];

      array_push($_SESSION['list'], $data);

      // Weergeven van lijst met bestanden, en tevens opnieuw het upload-form laten zien
      HTML_PhotoList::showList($_SESSION['list']);
      HTML_PhotoList::showUploadForm();
      break;

   default:
      $list = array();
      session_register('list');

      // Weergeven van uploadform
      HTML_PhotoList::showUploadForm();
      break;
}
?>

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Waarom maak je niet gewoon meerdere input velden om files te uploaden? Anders kun je standaard er 1 weergeven en met een plus icoontje daarnaast meerdere velden aanmaken mbv. JavaScript. Ik zie het probleem niet zo :)

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op woensdag 12 december 2007 @ 23:37:
De variabelen staan wel in de sessie, maar volgens mij bestaan de bestanden niet meer.
Dat is normaal gedrag:
The file will be deleted from the temporary directory at the end of the request if it has not been moved away or renamed.
De oplossing voor Cartman! lijkt me het eenvoudigst, maar je moet opletten dat je dan niet in de problemen komt door de totale bestandsgrootte. En anders zul je toch zelf een tmpdir moeten gebruiken en af en toe automatisch laten opschonen.

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Cartman! schreef op woensdag 12 december 2007 @ 23:52:
Waarom maak je niet gewoon meerdere input velden om files te uploaden? Anders kun je standaard er 1 weergeven en met een plus icoontje daarnaast meerdere velden aanmaken mbv. JavaScript. Ik zie het probleem niet zo :)
Icoontje lijkt me niet eens nodig. Zo zet Horde IMP er automagisch een extra file-veldje onder de eerste bij aan, zodra je bij die eerste een bestand geselecteerd hebt.

  • Cartman!
  • Registratie: April 2000
  • Niet online
Dat is uiteraard een mogelijkheid maar dat mag de TS zelf uitzoeken hoe hij dat wil aanpakken :)

  • ATS
  • Registratie: September 2001
  • Laatst online: 18-09 15:14

ATS

En daar is ook enorm veel over te vinden via Google trouwens. Prachtige kant en klare multi-file upload scripts met feedback en al.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Verwijderd

Je eigen session handler schrijven die automatisch de bestanden verwijdert als de session destroyed wordt? Eventueel de bestanden in een db stoppen of zo.

Acties:
  • 0 Henk 'm!

  • NBeat
  • Registratie: December 2005
  • Laatst online: 19-07 16:38
code:
1
<body onUnload="location.href='flush_tmp_dir.php'">


of iets in die richting

XBOX Live Gamertag > NBeat


Acties:
  • 0 Henk 'm!

Verwijderd

NBeat schreef op vrijdag 14 december 2007 @ 11:13:
code:
1
<body onUnload="location.href='flush_tmp_dir.php'">


of iets in die richting
Da's niet errug betrouwbaar, als je browser bijv. crashed dan gebeurd er niets.

Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Stop uploading passwords to Github!

Pagina: 1