2013-02-14 60 views
1

我目前正在爲非常大的文件(大於服務器將允許的範圍)開發一個上傳模塊,其中包含進度和所有內容。看下面的代碼。 它適用於文本文件,圖像,甚至doc和pdf文件。 它崩潰的任何其他文件類型。 任何人有任何建議?使用FileReader和php上傳大文件

var fr = new FileReader; 
chunkSize = 524288; 
//chunkSize = window.maxPost; 
var chunks = Math.ceil(file.size/chunkSize); 
var chunk = 0; 
function SendSlice() { 
    var start, end; 
    start = chunk * chunkSize; 
    if (start > file.size) { 
     start = end + 1; 
    } 
    end = start + (chunkSize - 1) >= file.size ? file.size : start + (chunkSize - 1); 
    status = chunk == 0 ? "start" : (chunk == chunks ? "end" : "progress"); 
    if (status == 'start') { 
      $("#upload-area").append("<p>Upload started for file " + file.name + "</p>"); 
    } 
    fr.onload = function(e) { 
     var sliceData = e.target.result; 
     $.ajax({ 
      type : "POST", 
     url : "uploader.php", 
     data : { 
      filename : file.name, 
      status : status, 
      slice : sliceData 
     } 
     }).success(function(data) { 
      if (++chunk <= chunks) { 
       SendSlice(); 
       var progress = (chunk/chunks) * 100; 
       $("#progress-text").html(progress.toFixed(2) + "%"); 
       $("#progress").css({ 
        width : progress + "%" 
       }); 
      } else { 
       $("#upload-area").append("<p>File " + file.name + " uploaded succesfully. Download file <a target='_blank' href='uploads/" + file.name + "'>here</a></p>"); 
      } 
     }); 
    }; 
    fr.readAsDataURL(file.slice(start, end)); 
} 
SendSlice(); 

而且PHP代碼:

if($_POST['status'] == 'start') { 
if (file_exists("uploads/" . $_POST['filename'])) { 
    unlink("uploads/" . $_POST['filename']); 
} 
} 
$data = explode(",", $_POST['slice']); 
$data = $data[1]; 
$data = base64_decode($data); 
file_put_contents("uploads/" . $_POST['filename'], $data, FILE_APPEND); 

而且,我一直在使用readAsBinaryString嘗試過,但我沒有想法怎麼處理結果在PHP。請指點

+0

當你說「崩潰' - 你實際得到了什麼錯誤信息?而且,您用於上傳的特定文件是什麼 - 舉例說明類型。這應該有所幫助。 – 2013-02-14 14:25:26

+0

是的,對不起。它實際上並沒有崩潰。它上傳文件,但是當我嘗試下載它時,它是腐蝕的。我試過上傳zip,rar,cab,甚至exe文件。 – d4rkpr1nc3 2013-02-14 14:37:05

回答

3

這僅僅是一個在黑暗中拍攝,但看file.slice API(http://www.w3.org/TR/FileAPI/#dfn-slice),它說:

「slice方法返回一個字節不等的可選開始一個新的Blob對象參數直到但不包括可選的結束參數,並帶有一個類型屬性,它是可選的contentType參數的值。「

但是,在使用它之前,你從「end」中減去1 - 這是否意味着在每個塊上省略1個字節(因爲結尾字節不包括在內)?

(另外,你消毒$ _ POST [「名」]在使用它之前 - 不,有人把「../yourscript.php」在那裏..權;?))

+0

讓我試試這個... – d4rkpr1nc3 2013-02-14 14:47:42

+0

是的,那正是問題!謝謝 – d4rkpr1nc3 2013-02-14 14:48:52

+0

是的,我會清理它。 – d4rkpr1nc3 2013-02-14 14:50:29