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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1360閲覧

canvasで画像を作成してもらいフォームで送信してもらう

tonpoko

総合スコア5

canvas

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/09/11 22:51

編集2020/09/11 23:31

前提・実現したいこと

ユーザーにcanvasで画像を作成してもらい、その画像をフォームで送信してもらうプログラムを考えています。
自分なりに試したことは
1,jsを使いcanvas画像をBase64に直す
2,AjaxでPHPにPOST送信
3,PHPでbase64をデコード。一時的な画像を作成。
4,それをformのfileに代入
みたいな感じ行けるのでは?と思ったのですが「4」の方法がわかりませんでした。(*3までは動きます)

現状で望むのは「4」の方法です。
ただ、根本的にいらない作業で遠回りしてるのかもしれません。もっと簡単な方法があればそちらの答えも求めています。
どなたかお分かりになる方、知識をお借りできれば幸いです。
よろしくお願いしますm(_)m

js

1function toBase64() { 2 Base64 = canvas.toDataURL('image/png'); 3 let formData = new FormData(); 4 formData.append("Data", Base64); 5 return formData; 6} 7 8function asyncRequest(Base64){ 9 const xhr = new XMLHttpRequest(); 10 xhr.open("POST", "/test.php", true); 11 xhr.onload = function(e) { 12 if (xhr.readyState == 4 && xhr.status == 200) { 13 console.log(xhr.responseText); 14 } 15 }; 16 xhr.send(Base64); 17} 18

PHP

1define('UPLOAD_DIR', './test/'); 2$img = $_POST['Data']; 3$img = str_replace('data:image/png;base64,', '', $img); 4$img = str_replace(' ', '+', $img); 5$data = base64_decode($img); 6$file = UPLOAD_DIR . 'aa' . '.png'; 7$success = file_put_contents($file, $data); 8print $success ? $file : 'Unable to save the file.';

html

1<form> 2<input type="file" name="f" size="30" id=""> 3</form>

##追記
添付ファイルで画像確認するのが目的の1つです。base64やBlobをformに埋め込むのは出来ますが大量のサイズになるのに加えて受信時に画像確認ができないとの判断です

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

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

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

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

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

guest

回答1

0

ベストアンサー

根本的にいらない作業で遠回りしてるのかもしれません。もっと簡単な方法があれば

  1. jsを使いcanvas画像をBlob(or File)に変換する
  2. FormData を使って、PHPにPOST送信(Ajax)

※PHPでは通常のフォームと同様に処理できる

こんな感じでしょうか。


コメントを受けて追記

Blobも試したのですが画像作成までたどり着けなくて

Canvasの初期の頃から DataURL 取得は常套手段でしたが、データ部(Base64)をJSで取り出す別解になります。

Canvas -> DataURL -> Blob

  1. バイト配列化(Uint8Array)
  2. Blob(File) に変換

CODEPEN parseDataURL() の後方にてコメントしている箇所はヒントになるかもしれません。

※ご質問のコードでも FormData を採用されているので、PHP側を弄らない方向が良いと感じています。
ちなみにFormData.append() の Syntax 2つ目のコード(ファイル追加用)を利用する必要があります。

投稿2020/09/11 22:59

編集2020/09/11 23:44
AkitoshiManabe

総合スコア5432

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

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

tonpoko

2020/09/11 23:21

Blobも試したのですが画像作成までたどり着けなくて・・Base64で妥協しています。 わかりにくくてすいません。現状で必要なのはフォームに画像を埋め込む処理がわからないことです。メールとして送られてきた添付ファイルを確認したいのです。*サーバー上にいらない画像が貯まるのを懸念
tonpoko

2020/09/12 14:03

回答ありがとうございます。 #ちなみにFormData.append() の Syntax 2つ目のコード・・ とは、formData.append(name, value, filename); のファイルネームを任意で追加するということでしょうか?どうしてもPHP側で値が取れなくて・・ Base64 = canvas.toDataURL('image/png'); let bin = atob(Base64.split(',')[1]) let buffer = new Uint8Array(bin.length); for (var i = 0; i < bin.length; i++) { buffer[i] = bin.charCodeAt(i); } let blob = new Blob([buffer.buffer], {type: 'image/png'}); console.log(blob); //Blob {size: 25974, type: "image/png"} let formData = new FormData(); formData.append("Data", blob, 'filename'); formData.append('name', 'hoge'); //送信テスト用 #PHP print_r($_POST); Array ( [name] => hoge ) となりblobがPOSTされていない状態になります。なにか特殊なとり方があるのでしょうか? どこか間違ってる箇所があればぜひご教授ください。お願いいたします
AkitoshiManabe

2020/09/12 16:22

php に送信する ファイルフィールド の name属性は phpに合わせて files[] のような名称を使いませんか? formData.append() の第一引数が input[name] に相当します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問