He encontrado algunas publicaciones diferentes e incluso preguntas en stackoverflow que responden a esta pregunta. Básicamente estoy implementando lo mismo que esta publicación .
Así que aquí está mi problema. Cuando subo la foto, también necesito enviar el resto del formulario. Aquí está mi html:
<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>
Anteriormente, no necesitaba cambiar el tamaño de la imagen, por lo que mi javascript se veía así:
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...
}
}
});
};
Todo esto funcionó muy bien ... ahora que necesito cambiar el tamaño de las imágenes ... ¿cómo puedo reemplazar la imagen en el formulario para que se publique la imagen redimensionada y no la imagen cargada?
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...
}
}
});
};
He pensado en mover la entrada del archivo fuera del formulario y tener una entrada oculta en el formulario en la que configuré el valor del valor de la imagen redimensionada ... Pero me pregunto si puedo reemplazar la imagen que ya está en el formulario.
fuente
BufferedImage dest = src.getSubimage(rect.x, rect.y, rect.width, rect.height);
Respuestas:
Esto es lo que terminé haciendo y funcionó muy bien.
Primero moví la entrada del archivo fuera del formulario para que no se envíe:
Luego cambié la
uploadPhotos
función para manejar solo el cambio de tamaño:Como puede ver, estoy usando
canvas.toDataURL('image/jpeg');
para cambiar la imagen redimensionada en un dataUrl y luego llamo a la funcióndataURLToBlob(dataUrl);
para convertir el dataUrl en un blob que luego puedo agregar al formulario. Cuando se crea el blob, desencanto un evento personalizado. Aquí está la función para crear el blob:Finalmente, aquí está mi controlador de eventos que toma el blob del evento personalizado, agrega el formulario y luego lo envía.
fuente
width *= max_size / width;
realmente quisiste decirwidth *= max_size / height;
.si hay alguno interesado, hice una versión mecanografiada:
y aquí está el resultado de javascript:
el uso es como:
o (
async
/await
):fuente
Uncaught (in promise) TypeError: Cannot read property 'type' of undefined
maxSize
está en bytes o kb?Si algunos de ustedes, como yo, encuentran problemas de orientación, he combinado las soluciones aquí con una corrección de orientación exif
https://gist.github.com/SagiMedina/f00a57de4e211456225d3114fd10b0d0
fuente