2012-01-25 4 views
13

Когда я использую plupload для chunk-файлов (параметр настройки chunk_size), я получаю отдельный запрос PHP для каждого фрагмента. Рассматривая переменную $_FILES, каждый кусок имеет тип "application/octet-stream".Обработка загруженных загрузок plupload на стороне сервера

Есть ли простой, стандартный и удобный способ объединения этих частей в PHP на стороне сервера?

С гарантией разумности (например, когда одна из частей отсутствует и т. Д.).

ответ

14

Вот способ разобрать куски и сохранить результат в $ upload_file (изменить $ uploaded_file в соответствии с тем, что вам нужно).

$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

Благодарности Kris. Это код, который вы обычно используете для этой цели? С plupload или другой библиотекой? – TMS

+0

Я использую это с компонентом flash plupload. Он должен быть совместим со всеми plupload, в которых используются куски. –

+1

Крис, но у меня нет 'unique_id' в запросе $ _POST. Можете ли вы также показать мне, как вы настраиваете объект plupload? Используете ли вы 'multipart: true'? – TMS