javascriptでinput type="file"を作って送信
やりたかったこととしては、ユーザーが指定した画像をjavascriptで加工(トリミングやリサイズ)したファイルをinput type="file"に指定してアップロードしたかった。
結論から言うとFormDataにBlob型のオブジェクトをセットして送信すればいいみたい。
var file2blob = function(file) { return new Promise(function(resolve, reject) { var reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function(theFile) { var img = new Image(); img.src = theFile.target.result; img.onload = function() { var canvas = document.createElement('canvas'); var ctx = canvas.getContext('2d'); canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0); var base64 = canvas.toDataURL('image/jpeg'); var blob = base64toBlob(base64); deffered.resolve(blob); }; }; }); return deffered.promise; }; var base64toBlob = function(base64) { var tmp = base64.split(','); var data = atob(tmp[1]); var mime = tmp[0].split(':')[1].split(';')[0]; var buf = new Uint8Array(data.length); for (var i = 0; i < data.length; i++) { buf[i] = data.charCodeAt(i); } var blob = new Blob([buf], { type: mime }); return blob; } var file = document.getElementById('file'); file.addEventListener('change', function(event) { var image = event.target.files[0] convertImg(image) .then(function(image) { var formData = new FormData(); formData.append('image', image, 'image.jpg'); var request = new XMLHttpRequest(); request.open('POST', 'http://example.com/'); request.send(formData); });
以上です