2012-01-25 37 views
13

Khi tôi sử dụng tệp plupload cho các tệp chunk (thiết lập tùy chọn chunk_size), tôi nhận được yêu cầu PHP riêng cho từng đoạn. Nhìn vào biến số $_FILES, mỗi đoạn là loại "application/octet-stream".Xử lý tải lên được tải lên của các bản tải lên ở phía máy chủ

Có cách nào đơn giản, tiêu chuẩn và thoải mái như thế nào để kết hợp các phần này trong PHP ở phía máy chủ không?

Đảm bảo sự an toàn (ví dụ: khi một trong các phần bị thiếu, v.v ...).

Trả lời

14

Đây là cách phân tích cú pháp khối và lưu trữ kết quả trong $ upload_file (thay đổi $ uploaded_file để khớp với những gì bạn cần).

$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

Cảm ơn Kris. Đây có phải là mã bạn thường sử dụng cho mục đích đó không? Với plupload hoặc thư viện khác? – TMS

+0

Tôi sử dụng điều này với thành phần flash plupload. Nó phải tương thích với tất cả các plupload có sử dụng khối. –

+1

Kris, nhưng tôi không có bất kỳ 'unique_id' trong yêu cầu $ _POST. Bạn cũng có thể chỉ cho tôi cách bạn thiết lập đối tượng plupload không? Bạn có sử dụng 'multipart: true' không? – TMS

Các vấn đề liên quan