2016-06-16 67 views
0

好的,我正在編寫一個laravel web項目,我已經編寫了這個代碼(我在線學習)來上傳視頻和照片。上傳圖片時,此代碼工作正常,因爲它們很輕。但是,當它到達視頻時,它對於輕視頻效果不錯,但試圖凍結瀏覽器以獲得30MB以上的視頻。最令人討厭的部分是,當我嘗試從手機上傳(圖片或視頻)時,該設備抱怨'由於內存不足而無法完成操作',因爲此代碼凍結瀏覽器以查看重量級視頻並抱怨移動設備上的內存意味着不夠好(便攜)。請欣賞有更好的代碼片段來完成這項工作(jQuery歡迎)。編寫便攜式js上傳代碼(JS代碼在桌面上工作,並在移動設備上失敗)

這裏是我有什麼

function uploadPhoto(url, photo) { 
 

 
var token = $('#token').val(); 
 
var formData = new FormData(); 
 
formData.append('photo', photo); 
 
formData.append('_token', token); 
 
var ajax = new XMLHttpRequest(); 
 
ajax.upload.addEventListener('progress', progressHandler, false); 
 
ajax.addEventListener('load', completeHandler, false); 
 
ajax.addEventListener('error', errorHandler, false); 
 
ajax.addEventListener('abort', abortHandler, false); 
 
ajax.open('POST', url); 
 
ajax.send(formData); 
 
    } 
 

 
function uploadVideo() { 
 
    var route = $('#uploadUrl').val(); 
 
    var token = $('#token').val(); 
 
    var video = document.getElementById('postVideo').files[0]; 
 
    var formData = new FormData(); 
 
    formData.append('video', video); 
 
    formData.append('_token', token); 
 
    var ajax = new XMLHttpRequest(); 
 
    ajax.upload.addEventListener('progress', progressHandler, false); 
 
    ajax.addEventListener('load', completeHandler, false); 
 
    ajax.addEventListener('error', errorHandler, false); 
 
    ajax.addEventListener('abort', abortHandler, false); 
 
    ajax.open('POST', route); 
 
    ajax.send(formData); 
 
    }

在事件偵聽器的功能已代碼採取適當行動等預先顯示進度bar..Thanks的幫助

回答

2

根據錯誤消息'Failed to complete operation due to low memory'得出的問題是,您正在耗盡內存(或在移動設備上爲該應用程序/實例分配的RAM)。

Uploading Techniques in Javascript

你看到上傳的問題30MB文件是需要加載整個文件到內存中,我不知道誰擁有的確切細節的內存地址度過它是應用程序限制所以Chrome或設備本身。你最好的選擇是做大塊上傳,它有很多好處,現在只需要佔用1MB(或者任何你想要的大小)就可以分塊。這樣可以使上傳更順暢,因爲不再需要加載整個視頻。

這是一個非常大的文章/解決方案,所以我不會將代碼添加到答案中,因爲它有很多部分,但我已經用它作爲實現分塊上傳的基礎。這將解決您在所有瀏覽器/設備上的問題。

- 作爲一個便箋,你總是可以限制多少上傳,所以這不會發生,但如果大量上傳是你試圖實現這是一個很好的開始。

+0

好的,謝謝@Andrei M.我會詳細介紹一下您提供的資源 –

相關問題