File APIで読み込んだ画像をCanvasでリサイズしたあと、その画像をフォームデータとしてサーバに送信したいと考えています。とりあえず以下のようにAJAXでフォームを送信する方法はできたのですが、AJAXではなく普通に画面遷移する形でフォーム送信がしたいです。
リサイズした画像ファイルをフォーム送信する方法を教えて下さい。
html
1<!doctype html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <title>TEST</title> 6</head> 7<body> 8 <form id="upload-form" action="upload" method="post" enctype="multipart/form-data"> 9 <input id="input-file" type="file"> 10 <input id="upload-button" type="submit" value="Submit"> 11 </form> 12 <script src="javascripts/myscript.js"></script> 13</body> 14</html>
javascript
1window.onload = function() { 2 resize(); 3 upload(); 4} 5 6function resize() { 7 var input = document.getElementById('input-file'); 8 input.addEventListener('change', function() { 9 var file = this.files[0]; 10 if (!file.type.match(/^image\/(png|jpeg|gif)$/)) return; 11 12 var canvas = document.createElement('canvas'); 13 if (!canvas || !canvas.getContext) return; 14 15 var img = new Image(); 16 var fr = new FileReader(); 17 18 fr.onload = function() { 19 img.onload = function() { 20 canvas.width = img.width * 0.1; 21 canvas.height = img.height * 0.1; 22 var ctx = canvas.getContext('2d'); 23 ctx.drawImage(img, 0, 0, canvas.width, canvas.height); 24 document.getElementsByTagName('body')[0].appendChild(canvas); 25 } 26 27 img.src = this.result; 28 } 29 30 fr.readAsDataURL(file); 31 32 }); 33} 34 35function upload() { 36 var button = document.getElementById('upload-button'); 37 button.addEventListener('click', function(e) { 38 e.preventDefault(); 39 40 var form = document.getElementById('upload-form'); 41 var formData = new FormData(form); 42 var canvases = document.getElementsByTagName('canvas'); 43 for (var i = 0; i < canvases.length; i++) { 44 formData.append("avatar", createBlob(canvases[i].toDataURL('image/jpg'))); 45 } 46 47 var request = new XMLHttpRequest(); 48 request.open("POST", "upload"); 49 request.send(formData); 50 }); 51} 52 53function createBlob(dataUrl) { 54 var bin = atob(dataUrl.replace(/^.*,/, '')); 55 var buffer = new Uint8Array(bin.length); 56 for (var i = 0; i < bin.length; i++) { 57 buffer[i] = bin.charCodeAt(i); 58 } 59 var blob = new Blob([buffer.buffer], { 60 type: 'image/jpg' 61 }); 62 return blob; 63}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/23 13:43
2016/03/23 14:10