我需要为未来的项目创建一个图片上传工具(不使用flash,IE10+,FF7+等),客户端可以进行图片调整、转换和裁剪,而无需在服务器上进行。
因此,我创建了一个JavaScript界面,用户可以在浏览器中“上传”文件并直接缩放或裁剪,而不必与服务器联系。性能还可以,虽然不是很好,但能正常工作。
最终结果是一组canvas元素。用户可以在调整大小后编辑/裁剪图像,因此我将它们保留为canvas而不是转换为JPEG(这会降低初始性能)。
现在这个工具运行良好,但我不知道如何将已完成的canvas元素上传到服务器。 (使用服务器上的asp.net 4通用处理程序)
我已经尝试从包含每个画布数据URL的所有元素创建JSON对象。
问题是,当我拥有10-40张照片时,浏览器在创建数据URL时开始冻结,特别是对于大于2兆字节的图像。
上传程序
因此,我创建了一个JavaScript界面,用户可以在浏览器中“上传”文件并直接缩放或裁剪,而不必与服务器联系。性能还可以,虽然不是很好,但能正常工作。
最终结果是一组canvas元素。用户可以在调整大小后编辑/裁剪图像,因此我将它们保留为canvas而不是转换为JPEG(这会降低初始性能)。
现在这个工具运行良好,但我不知道如何将已完成的canvas元素上传到服务器。 (使用服务器上的asp.net 4通用处理程序)
我已经尝试从包含每个画布数据URL的所有元素创建JSON对象。
问题是,当我拥有10-40张照片时,浏览器在创建数据URL时开始冻结,特别是对于大于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
});
如何将画布元素发送到服务器是最佳方式?
我应该一次性全部发送还是逐个发送?