Ich habe ein paar verschiedene Beiträge und sogar Fragen zum Stackoverflow gefunden, die diese Frage beantworten. Ich implementiere im Grunde das Gleiche wie dieser Beitrag .
Also hier ist mein Problem. Wenn ich das Foto hochlade, muss ich auch den Rest des Formulars einreichen. Hier ist mein 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>
Zuvor musste ich die Größe des Bildes nicht ändern, daher sah mein Javascript folgendermaßen aus:
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...
}
}
});
};
Das alles hat super funktioniert ... jetzt, wo ich die Größe der Bilder ändern muss ... wie kann ich das Bild im Formular ersetzen, damit das Bild in der Größe veröffentlicht wird und nicht das hochgeladene Bild?
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...
}
}
});
};
Ich habe darüber nachgedacht, die Dateieingabe aus dem Formular zu verschieben und eine versteckte Eingabe in dem Formular zu haben, für die ich den Wert auf den Wert des verkleinerten Bilds festgelegt habe ... Aber ich frage mich, ob ich das Bild einfach ersetzen kann ist schon in der Form.
quelle
BufferedImage dest = src.getSubimage(rect.x, rect.y, rect.width, rect.height);
Antworten:
Hier ist, was ich letztendlich gemacht habe und es hat großartig funktioniert.
Zuerst habe ich die Dateieingabe außerhalb des Formulars verschoben, damit sie nicht gesendet wird:
Dann habe ich die
uploadPhotos
Funktion geändert , um nur die Größenänderung zu handhaben:Wie Sie sehen
canvas.toDataURL('image/jpeg');
, ändere ich das Bild mit geänderter Größe in ein dataUrl adn und rufe dann die FunktiondataURLToBlob(dataUrl);
auf, um das dataUrl in einen Blob zu verwandeln, den ich dann an das Formular anhängen kann. Wenn der Blob erstellt wird, löse ich ein benutzerdefiniertes Ereignis aus. Hier ist die Funktion zum Erstellen des Blobs:Schließlich ist hier mein Ereignishandler, der den Blob aus dem benutzerdefinierten Ereignis nimmt, das Formular anfügt und es dann sendet.
quelle
width *= max_size / width;
hast, hast du es tatsächlich gemeintwidth *= max_size / height;
.Bei Interesse habe ich eine Typoskript-Version erstellt:
und hier ist das Javascript-Ergebnis:
Verwendung ist wie:
oder (
async
/await
):quelle
Uncaught (in promise) TypeError: Cannot read property 'type' of undefined
maxSize
ist in Bytes oder kb?Wenn einige von Ihnen, wie ich, auf Orientierungsprobleme stoßen, habe ich die Lösungen hier mit einem exif-Orientierungsfix kombiniert
https://gist.github.com/SagiMedina/f00a57de4e211456225d3114fd10b0d0
quelle