Devo creare un uploader di immagini per un progetto futuro (senza flash, IE10 +, FF7 + ecc.) Che ridimensiona/converte/ritaglia immagine sul client e non sul server.Come caricare/caricare più elementi di canvas
Così ho creato un'interfaccia javascript in cui l'utente può "caricare" i propri file e ridimensionarli/croppare direttamente nel browser, senza mai contattare il server. La performance è OK, non così buona, ma funziona.
Il risultato finale è un array di elementi canvas. L'utente può modificare/ritagliare le immagini dopo che sono state ridimensionate, quindi le tengo come canvas invece di convertirle in jpeg. (Che peggiorerebbe la prestazione iniziale)
Ora funziona correttamente, ma non so quale sia il modo migliore per caricare effettivamente gli elementi di tela finiti sul server ora. (Utilizzo di un gestore generico asp.net 4 sul server)
Ho provato a creare un oggetto JSON da tutti gli elementi contenenti il dataurl di ciascun canvas.
Il problema è che quando ho 10-40 immagini, il browser inizia a congelarsi durante la creazione dei dataurl, specialmente per le immagini che superano i 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);
}
convertendoli anche a un oggetto JSON (sto usando json2.js) di solito si blocca il mio browser. (FF7)
Il mio scopo
var UploadImage = function (pFileName, pName, pDescription) {
this.FileName = pFileName;
this.Name = pName;
this.Description = pDescription;
this.data = null;
}
Il caricamento di routine
//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
});
Quale sarebbe il modo migliore per inviare gli elementi di tela al server?
Devo inviarli tutti in una volta o uno per uno?
Questa è una domanda piuttosto interessante . Non sei sicuro del perché 2 downvotes senza commenti, +1 –
Perché nel mondo questa domanda è stata downvoted? – Pointy
Genera l'url di dati e lo invia uno alla volta. Ciò ridurrà l'utilizzo della memoria. Permette anche di mostrare il progresso (xhr2 non è supportato). L'altro lato positivo è che la logica del server sarà leggermente più semplice e l'utilizzo della memoria sul server sarà inferiore. – Gerben