在對這個問題進行了大量的故障排除和調試之後,我發現了我認爲是的原因以及更好的解決方法。這有點「哈克」(我是一個業餘開發者!),所以我願意提出任何改善這個問題的建議,儘管它似乎對我有用。
從客戶端上傳的文件實際上是上傳到服務器上的此臨時位置: 的/ tmp/systemd-私營隨機數 -httpd.service- 隨機數的/ tmp/sess_ PHP -session-ID
在客戶端上傳完成後,UI進度條會達到100%,並且在服務器正在處理這些文件時保持這種狀態。
服務器端的處理包括將文件從上面的/ tmp位置移動(複製,然後刪除)到相關的blueimp位置。 (假設在blueimp選項中啓用了「user_dirs」,默認目的地是:/ var/www/html/server/php/files/php-session-id /)。
此複製過程可能會花費大量時間,特別是在大於2GB或大約2GB的文件上。一旦服務器處理完成,blueimp會觸發「fileuploaddone」回調,UI將更新爲完成狀態。
我的目標是在此時提供一些交互式UI反饋(而不是像其他解決方法一樣掛在90%)。我的環境能夠上傳非常大的文件(10GB +),所以我不認爲不接受任何用戶對文件處理可能需要幾分鐘的反饋(用戶認爲該網站崩潰並關閉瀏覽器等) )。
我的解決方法:
我遇到的是,當文件上傳已經完成了在客戶端和服務器的處理開始似乎沒有成爲一個點的blueimp回調的第一個問題。所以我通過創建一個函數(在main.js中)在data.loaded後匹配數據顯示我的自定義「processing div」來解決此問題。總:
$('#fileupload').bind('fileuploadprogressall', function (e, data) { console.log(data);
if (data.loaded == data.total) {
setTimeout(function(){
$("#processwarn").fadeTo(300, 1);
},3000);
}})
我定製的div位於下方的進度條信息是進行刷新(用ajax.load)每隔幾秒鐘,並計算在當前會話中上傳的所有文件的總文件大小另一個PHP頁面文件夾(目錄總規模似乎並沒有提供準確的結果):
// Calculate size of files being processed
$filePath = "/var/www/html/server/php/files/*php-session-id*/";
$total = 0;
$d = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($filePath),
RecursiveIteratorIterator::SELF_FIRST
);
foreach($d as $file){
$total += $file->getSize();
}
// Convert to readable format
if ($total >= 1073741824)
{
$total = number_format($total/1073741824, 2) . ' GB';
}
elseif ($total >= 1048576)
{
$total = number_format($total/1048576, 2) . ' MB';
}
elseif ($total >= 1024)
{
$total = number_format($total/1024, 2) . ' KB';
}
elseif ($total > 1)
{
$total = $total . ' bytes';
}
elseif ($total == 1)
{
$total = $total . ' byte';
}
else
{
$total = '0 bytes';
}
// Display spinner gif and size of file currently being processed
echo "<img src=\"img/spinner.gif\" height=\"20px\" width=\"20px\"> Please wait, processing files: $total";
結果看起來是這樣的:
編輯:(後一些更多的工作) - 隨着引導進度條補充,而不是:
附加點從測試中發現:
隨着分塊啓用(例如設置爲1GB(maxChunkSize :1000000000)),問題幾乎消失,因爲「複製」處理髮生在分塊點(本例中每1GB),處理時間顯着減少到用戶。 當最後的處理髮生時,服務器只需「rechunk」/複製剩餘的最後1GB。
由於此,我也經歷了更快的總體上傳時間。事後看來,這對許多人來說可能是更簡單/更有效的解決方案。
_The上傳process_瀏覽器發送2gig到Apache,Apache的傳遞2gig到PHP,您的代碼運行做了'move_uploaded_file()以'和移動2演出從一個目錄到另一個。上傳完成後至少會發生最後一部分 – RiggsFolly
感謝您的回覆。上傳過程本身非常快,問題在於上傳完成後。 「移動文件」操作會立即在命令行中執行。那麼上傳後實際發生什麼情況會導致此延遲? – BSUK