Tôi phải tạo trình tải lên hình ảnh cho một dự án trong tương lai (Không có flash, IE10 +, FF7 + v.v.) để thay đổi kích thước/chuyển đổi hình ảnh trên máy khách và không phải trên máy chủ.Cách tải lên/POST nhiều phần tử canvas
Vì vậy, tôi đã tạo giao diện javascript nơi người dùng có thể 'tải lên' tệp của họ và trực tiếp nhận được/cắt trực tiếp trong trình duyệt mà không cần liên hệ với máy chủ. Hiệu suất là OK, không phải là tốt, nhưng nó hoạt động.
Endresult là một mảng các phần tử canvas. Người dùng có thể chỉnh sửa/cắt các hình ảnh sau khi chúng được thay đổi kích cỡ, vì vậy tôi giữ chúng dưới dạng canvas thay vì chuyển đổi chúng thành jpeg. (Điều này sẽ làm xấu đi hiệu suất ban đầu)
Bây giờ công việc này tốt, nhưng tôi không biết cách tốt nhất để tải các thành phần canvas đã hoàn thành lên máy chủ ngay bây giờ là gì. (Sử dụng trình xử lý chung asp.net 4 trên máy chủ)
Tôi đã thử tạo đối tượng json từ tất cả các phần tử chứa dataurl của mỗi canvas.
Vấn đề là, khi tôi có 10-40 hình ảnh, trình duyệt bắt đầu đóng băng khi tạo dataurls, đặc biệt là đối với hình ảnh lớn hơn 2 megabyte.
//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);
}
Cũng chuyển đổi chúng thành đối tượng json (Tôi đang sử dụng json2.js) thường xuyên làm hỏng trình duyệt của mình. (FF7)
đối tượng My
var UploadImage = function (pFileName, pName, pDescription) {
this.FileName = pFileName;
this.Name = pName;
this.Description = pDescription;
this.data = null;
}
Việc tải thói quen
//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
});
Điều gì sẽ là cách tốt nhất để gửi các phần tử canvas đến máy chủ?
Tôi có nên gửi tất cả cùng một lúc hoặc từng cái một không?
Đây là một câu hỏi khá thú vị . Bạn không chắc chắn tại sao 2 phiếu giảm giá không có bất kỳ nhận xét nào, +1 –
Tại sao câu hỏi này lại bị bỏ qua? – Pointy
Tạo url dữ liệu và gửi nó cùng một lúc. Điều này sẽ làm giảm việc sử dụng bộ nhớ. Nó cũng cho phép bạn hiển thị tiến trình (là xhr2 không được hỗ trợ). Mặt khác là logic máy chủ sẽ dễ dàng hơn và sử dụng bộ nhớ trên máy chủ sẽ ít hơn. – Gerben