我必須爲未來的項目(無閃光,IE10 +,FF7 +等)創建圖像上傳器,該圖像上傳器在客戶端而不是服務器上進行圖像大小調整/轉換/裁剪。如何上傳/張貼多個畫布元素
所以我做了一個javascript界面,用戶可以'上傳'他們的文件,並在瀏覽器中直接調整大小/裁剪,而無需聯繫服務器。表現還算不錯,但效果不錯。
endresult是一個畫布元素的數組。用戶可以在圖像調整大小後編輯/裁剪圖像,所以我將它們保留爲畫布而不是將它們轉換爲jpeg。 (這會惡化最初的性能)
現在,這工作正常,但我不知道什麼是最好的方式實際上傳完成的畫布元素到服務器現在。 (在服務器上使用asp.net 4通用處理程序)
我試圖從包含每個畫布的dataurl的所有元素創建一個json對象。
問題是,當我得到10-40張照片時,瀏覽器在創建數據傳輸時開始凍結,特別是對於大於2兆字節的圖像。
//images = array of UploadImage
for (var i = 0; i < images.length; i++) {
var data = document.getElementById('cv_' + i).toDataURL('image/jpg');
images[i].data = data.substr(data.indexOf('base64') + 7);
}
也將它們轉換爲json對象(我使用json2.js)通常會崩潰我的瀏覽器。 (FF7)
我的目標
var UploadImage = function (pFileName, pName, pDescription) {
this.FileName = pFileName;
this.Name = pName;
this.Description = pDescription;
this.data = null;
}
上傳程序
//images = array of UploadImage
for (var i = 0; i < images.length; i++) {
var data = document.getElementById('cv_' + i).toDataURL('image/jpg');
images[i].data = data.substr(data.indexOf('base64') + 7);
}
var xhr, provider;
xhr = jQuery.ajaxSettings.xhr();
if (xhr.upload) {
xhr.upload.addEventListener('progress', function (e) {
console.log(Math.round((e.loaded * 100)/e.total) + '% done');
}, false);
}
provider = function() {
return xhr;
};
var ddd = JSON.stringify(images); //usually crash here
$.ajax({
type: 'POST',
url: 'upload.ashx',
xhr: provider,
dataType: 'json',
success: function (data) {
alert('ajax success: data = ' + data);
},
error: function() {
alert('ajax error');
},
data: ddd
});
什麼是送畫布元素添加到服務器的最佳途徑?
我應該一次或一次發送它們嗎?
這是一個非常有趣的問題。不知道爲什麼2 downvotes沒有任何意見,+1 –
爲什麼在這個世界上這個問題downvoted? – Pointy
生成數據url並一次發送一個。這將減少內存使用量。它還使您能夠顯示進度(不支持xhr2)。另一個好處是服務器邏輯會稍微簡單一些,服務器上的內存使用量會更少。 – Gerben