質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

7939閲覧

Canvasでリサイズした画像ファイルをサーバにPOSTしたい

tktk8924

総合スコア14

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/03/22 10:01

編集2022/01/12 10:55

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

window.onloadをフォームのonsubmitにすればよいのでは?

JavaScript

1document.getElementById('upload-form').addEventListener('submit', function(e) { 2 e.preventDefault(); // フォームの元々の挙動を無効化 3 4 resize(); 5 upload(); 6});

みたいな感じで。

投稿2016/03/23 07:55

Asmape

総合スコア47

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tktk8924

2016/03/23 13:43

回答有り難うございます。 教えていただいたやり方だと、XMLHttpRequestによる非同期通信であることにはかわらないんじゃないでしょうか?(ページ遷移しない) やりたいこととしては、<input type="file">で読み込んだ画像をリサイズした画像で上書きして普通にフォームで送信することです。 そもそも画像の上書きができるのかわからないのですが。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問