J'ai trouvé quelques articles différents et même des questions sur stackoverflow répondant à cette question. J'implémente fondamentalement la même chose que ce post .
Voici donc mon problème. Lorsque je télécharge la photo, je dois également soumettre le reste du formulaire. Voici mon 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>
Auparavant, je n'avais pas besoin de redimensionner l'image, donc mon javascript ressemblait à ceci:
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...
}
}
});
};
Tout cela a très bien fonctionné ... maintenant que j'ai besoin de redimensionner les images ... comment puis-je remplacer l'image dans le formulaire afin que l'image redimensionnée soit publiée et non l'image téléchargée?
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...
}
}
});
};
J'ai pensé à déplacer l'entrée de fichier hors du formulaire et à avoir une entrée masquée sous la forme dont j'ai défini la valeur sur la valeur de l'image redimensionnée ... Mais je me demande si je peux simplement remplacer l'image qui est déjà sous la forme.
la source
BufferedImage dest = src.getSubimage(rect.x, rect.y, rect.width, rect.height);
Réponses:
Voici ce que j'ai fini par faire et cela a très bien fonctionné.
J'ai d'abord déplacé l'entrée du fichier en dehors du formulaire afin qu'elle ne soit pas soumise:
Ensuite, j'ai changé la
uploadPhotos
fonction pour gérer uniquement le redimensionnement:Comme vous pouvez le voir, j'utilise
canvas.toDataURL('image/jpeg');
pour changer l'image redimensionnée en dataUrl adn, puis j'appelle la fonctiondataURLToBlob(dataUrl);
pour transformer dataUrl en un blob que je peux ensuite ajouter au formulaire. Lorsque l'objet blob est créé, je déclenche un événement personnalisé. Voici la fonction pour créer le blob:Enfin, voici mon gestionnaire d'événements qui prend l'objet blob de l'événement personnalisé, ajoute le formulaire, puis le soumet.
la source
width *= max_size / width;
vous vouliez vraiment direwidth *= max_size / height;
.si vous êtes intéressé, j'ai fait une version dactylographiée:
et voici le résultat javascript:
l'utilisation est comme:
ou (
async
/await
):la source
Uncaught (in promise) TypeError: Cannot read property 'type' of undefined
maxSize
est en octets ou en ko?Si certains d'entre vous, comme moi, rencontrent des problèmes d'orientation, j'ai combiné les solutions ici avec un correctif d'orientation exif
https://gist.github.com/SagiMedina/f00a57de4e211456225d3114fd10b0d0
la source