Saya telah menemukan beberapa posting berbeda dan bahkan pertanyaan tentang stackoverflow menjawab pertanyaan ini. Saya pada dasarnya menerapkan hal yang sama seperti posting ini .
Jadi inilah masalah saya. Saat saya mengupload foto, saya juga harus menyerahkan formulir lainnya. Ini html saya:
<form id="uploadImageForm" enctype="multipart/form-data">
<input name="imagefile[]" type="file" id="takePictureField" accept="image/*" onchange="uploadPhotos(\'#{imageUploadUrl}\')" />
<input id="name" value="#{name}" />
... a few more inputs ...
</form>
Sebelumnya, saya tidak perlu mengubah ukuran gambar, jadi javascript saya terlihat seperti ini:
window.uploadPhotos = function(url){
var data = new FormData($("form[id*='uploadImageForm']")[0]);
$.ajax({
url: url,
data: data,
cache: false,
contentType: false,
processData: false,
type: 'POST',
success: function(data){
... handle error...
}
}
});
};
Ini semua bekerja dengan baik ... sekarang saya perlu mengubah ukuran gambar ... bagaimana saya bisa mengganti gambar di formulir sehingga yang diubah ukurannya diposting dan bukan gambar yang diunggah?
window.uploadPhotos = function(url){
var resizedImage;
// Read in file
var file = event.target.files[0];
// Ensure it's an image
if(file.type.match(/image.*/)) {
console.log('An image has been loaded');
// Load the image
var reader = new FileReader();
reader.onload = function (readerEvent) {
var image = new Image();
image.onload = function (imageEvent) {
// Resize the image
var canvas = document.createElement('canvas'),
max_size = 1200,
width = image.width,
height = image.height;
if (width > height) {
if (width > max_size) {
height *= max_size / width;
width = max_size;
}
} else {
if (height > max_size) {
width *= max_size / height;
height = max_size;
}
}
canvas.width = width;
canvas.height = height;
canvas.getContext('2d').drawImage(image, 0, 0, width, height);
resizedImage = canvas.toDataURL('image/jpeg');
}
image.src = readerEvent.target.result;
}
reader.readAsDataURL(file);
}
// TODO: Need some logic here to switch out which photo is being posted...
var data = new FormData($("form[id*='uploadImageForm']")[0]);
$.ajax({
url: url,
data: data,
cache: false,
contentType: false,
processData: false,
type: 'POST',
success: function(data){
... handle error...
}
}
});
};
Saya telah berpikir untuk memindahkan input file keluar dari formulir dan memiliki input tersembunyi dalam bentuk yang saya setel nilainya ke nilai gambar yang diubah ukurannya ... Tapi saya bertanya-tanya apakah saya bisa mengganti gambar itu sudah dalam bentuk.
sumber
BufferedImage dest = src.getSubimage(rect.x, rect.y, rect.width, rect.height);
Jawaban:
Inilah yang akhirnya saya lakukan dan berhasil dengan baik.
Pertama saya memindahkan input file ke luar formulir sehingga tidak dikirimkan:
Kemudian saya mengubah
uploadPhotos
fungsi untuk hanya menangani pengubahan ukuran:Seperti yang Anda lihat, saya menggunakan
canvas.toDataURL('image/jpeg');
untuk mengubah gambar yang diubah ukurannya menjadi dataUrl dan kemudian saya memanggil fungsidataURLToBlob(dataUrl);
untuk mengubah dataUrl menjadi gumpalan yang kemudian dapat saya tambahkan ke formulir. Saat blob dibuat, saya memicu peristiwa khusus. Berikut fungsi untuk membuat blob:Terakhir, berikut adalah event handler saya yang mengambil blob dari event khusus, menambahkan formulir dan kemudian mengirimkannya.
sumber
width *= max_size / width;
kamu maksud sebenarnyawidth *= max_size / height;
.jika ada yang berminat saya sudah membuat versi skrip:
dan inilah hasil javascriptnya:
penggunaan seperti:
atau (
async
/await
):sumber
Uncaught (in promise) TypeError: Cannot read property 'type' of undefined
maxSize
dalam byte atau kb?Jika beberapa dari Anda, seperti saya, mengalami masalah orientasi, saya telah menggabungkan solusi di sini dengan perbaikan orientasi exif
https://gist.github.com/SagiMedina/f00a57de4e211456225d3114fd10b0d0
sumber