2012-01-25 20 views
13

Kiedy używam plupload do dzielenia plików (opcja ustawienia chunk_size), otrzymuję oddzielne żądanie PHP dla każdej porcji. Patrząc na zmienną $_FILES, każda porcja jest typu "application/octet-stream".Obsługa załadowanych ładunków plupload po stronie serwera

Czy istnieje prosty, standardowy i wygodny sposób łączenia tych elementów w PHP po stronie serwera?

Z gwarancją zdrowia psychicznego (np. Brak jednego z elementów itp.).

Odpowiedz

14

Oto sposób na sparsowanie fragmentów i zapisanie wyniku w pliku $ upload_file (zmień plik $ uploaded na zgodny z potrzebnym).

$uploaded_file = '/tmp/uploadFile.jpg'; 

    $chunks = isset($_POST["chunks"]) ? $_POST["chunks"] : 0; 

    // If we have a chunked operation... 
    if ($chunks > 0) 
    { 
     // Get the chunk number... 
     $chunk = isset($_POST["chunk"]) ? $_POST["chunk"] : 0; 

     if ($chunk == 0) 
     { 
      if (!isset($_SESSION['last_chunk'])) 
      { 
       $_SESSION['last_chunk'] = array(); 
      } 
      $_SESSION['last_chunk'][$_POST['unique_id']] = $chunk; 
     } 
     else 
     { 
      if ($_SESSION['last_chunk'][$_POST['unique_id']] != $chunk + 1) 
      { 
       die('{"jsonrpc" : "2.0", "error" : {"code": 192, "message": "Uploaded chunks out of sequence. Try again."}, "id" : "id"}'); 
      } 
     } 

     $tmp_dir = sys_get_temp_dir(); 

     // We need a unique filename to identify the file... 
     $tmp_filename = $tmp_dir.$_POST['unique_id']; 

     // If it is the first chunk we have to create the file, othewise we append... 
     $out_fp = fopen($tmp_filename, $chunk == 0 ? "wb" : "ab"); 

     // The file we are reading from... 
     $uploaded_file = $_FILES['file']['tmp_name']; 
     $in_fp = fopen($uploaded_file, "rb"); 

     // Copy the chunk that was uploaded, into the file we are uploading... 
     while ($buff = fread($in_fp, 4096)) 
     { 
      fwrite($out_fp, $buff); 
     } 
     fclose($out_fp); 
     fclose($in_fp); 


     // If we are the last chunk copy the file to the final location and continue on... 
     if ($chunk == $chunks - 1) 
     { 
      copy($tmp_filename, $uploaded_file); 
      unset($_SESSION['last_chunk'][$_POST['unique_id']]); 
      if (count($_SESSION['last_chunk']) == 0) 
      { 
       unset($_SESSION['last_chunk']); 
      } 
     } 
     else 
     { 
      // Otherwise report the result to the uploader... 
      echo'{"jsonrpc" : "2.0", "result" : null, "id" : "id"}'; 
     } 
    } 
+0

Thanks Kris. Czy jest to kod, którego zwykle używasz do tego celu? Z plupload lub inną biblioteką? – TMS

+0

Używam tego z komponentem flash plupload. Powinien być zgodny ze wszystkimi plupload, który używa porcji. –

+1

Kris, ale nie mam żadnego 'unique_id' w żądaniu $ _POST. Czy możesz mi również pokazać, jak konfigurujesz obiekt plupload? Czy używasz 'multipart: true'? – TMS