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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

1回答

1866閲覧

Canvasの中身をformとしてPOSTし、DBに登録したい

redkick

総合スコア17

canvas

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

2クリップ

投稿2019/04/21 02:56

編集2019/04/21 03:29

他の方の質問などを参考に仕組んでみたのですが登録できず、下記コードのおかしい部分も思いつきません。
ご教授いただけないでしょうか?

追記:
参考にさせていただいたURL https://teratail.com/questions/11714

やりたい事としては画像をcanvasでリサイズさせて、その他textと一緒にDBへ登録させたいです。
canvasで画像の表示までは出来ており、いざPOSTさせようと実行してもエラー表示が出ず、canvasの値も受け取れていないのですが何処で躓いているのか見当がつかない状況です。

php

1upfile.php 2 3<html lang="ja"> 4<head> 5<meta charset="utf-8"> 6<title>アップロードテスト</title> 7<style> 8.preview { 9 max-width: 300px; 10 max-height: 300px; 11 width: 300px; 12 height: 300px; 13 border: 1px solid darkgray; 14} 15</style> 16 17<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 18<script src="https://cdnjs.cloudflare.com/ajax/libs/exif-js/2.3.0/exif.js"></script> 19<script> 20$(function(){ 21 $('#file1').change(function(e){ 22 //ファイルオブジェクトを取得する 23 var file = e.target.files[0]; 24 var reader = new FileReader(); 25 26 //画像でない場合は処理終了 27 if(file.type.indexOf("image") < 0){ 28 alert("画像ファイルを指定してください。"); 29 $("#file1").val(''); //選択したファイルをクリア 30 return false; 31 } 32 }); 33 34 window.addEventListener("load", function(){ 35 //2Dコンテキストのオブジェクトを生成する 36 cvs = document.getElementById('preview1'); 37 ctx = cvs.getContext('2d'); 38 } 39 $('#del1').click(function() { 40 ctx.clearRect(0, 0, 800, 800); 41 }); 42}); 43 44function canvasToBlob(canvas, callback, type) { 45 if (!type) { 46 type = 'image/png'; 47 } 48 49 if (canvas.toBlob) { 50 canvas.toBlob(callback, type); 51 } else if (canvas.toDataURL && window.Uint8Array && window.Blob && window.atob) { 52 var binStr = atob(canvas.toDataURL(type).replace(/^[^,]*,/, '')), 53 len = binStr.length, 54 arr = new Uint8Array(len); 55 56 for (var i = 0; i < len; i++) { 57 arr[i] = binStr.charCodeAt(i); 58 } 59 60 callback(new Blob([arr], { type: type })); 61 } else { 62 callback(null); 63 } 64} 65 66/** 67 * canvas画像の送信処理 68 * 69 * @param {Element} formElem フォームのDOMノード 70 */ 71function send(formElem) { 72 var canvasElem = document.getElementById('preview1'); 73 74 if (window.FormData) { 75 /** 76 * FormDataオブジェクトに対応している場合、 77 * canvas要素の画像をBlobオブジェクトに変換し、 78 * ファイルとして送信することを試みる 79 */ 80 canvasToBlob(canvasElem, function (canvasBlob) { 81 if (canvasBlob) { 82 /** 83 * canvas要素の画像をBlobオブジェクトとして出力できた場合、 84 * FormDataオブジェクトにファイルとして追加し、送信 85 */ 86 87 /** 88 * FormDataオブジェクトを生成 89 */ 90 var fd = new FormData(formElem); 91 /** 92 * Blobオブジェクトを追加。 93 * これにより、サーバ側ではcanvas-imageパラメータから 94 * 画像ファイルとして取り込める 95 */ 96 fd.append('img1', canvasBlob); 97 98 /** 99 * XMLHttpRequestオブジェクトを生成 100 */ 101 var xhr = new XMLHttpRequest(); 102 103 // ------------------------- 104 // Ajax通信完了時の処理などを記述… 105 // ------------------------- 106 107 /** 108 * Ajax通信の送信先・送信形式を指定 109 * この例では、送信先としてフォームのaction属性値を使用 110 */ 111 xhr.open('POST', formElem.action, true); 112 113 /** 114 * FormDataオブジェクトをAjax送信 115 */ 116 xhr.send(fd); 117 } else { 118 /** 119 * canvas要素の画像をBlobオブジェクトとして出力できなかった場合、 120 * 送信できなかった事をアラート 121 */ 122 alert('canvasの内容を送信できませんでした。\nお使いのブラウザは、Blobオブジェクトの生成に必要な機能に対応していません。'); 123 } 124 }, 'image/png'); 125 } else { 126 /** 127 * FormDataオブジェクトに対応していない場合、 128 * 送信できない事をアラート 129 */ 130 alert('canvasの内容を送信できませんでした。\nお使いのブラウザは、FormDataオブジェクトに対応していません。'); 131 } 132} 133 134/** 135 * フォームが送信される時に実行する処理 136 */ 137document.getElementById('form-id').addEventListener('submit', function (e) { 138 /** 139 * フォームの要素を取得 140 */ 141 var formElem = this; 142 143 /** 144 * フォームの送信をキャンセル 145 */ 146 e.preventDefault(); 147 148 /** 149 * フォームをAjax送信 150 */ 151 send(formElem); 152}, false); 153 154</script> 155</head> 156<body> 157 <form action="upload.php" method="post" id="form-id" enctype="multipart/form-data"> 158 <canvas id="preview1" class="preview"></canvas> 159<br> 160 <input type="file" accept="image/*" name="img1" id="file1"><input type="button" id="del1" value="クリア"> 161 162<script> 163$(function(){ 164 165 var canvas = document.getElementById( "preview1" ); 166 var ctx = preview1.getContext('2d'); 167 168 //ファイルを読み込んだら 169 $('#file1').on('change', function(e){ 170 171 var fileData = e.target.files[0]; 172 var orientation; 173 174 var reader = new FileReader(); 175 176 var image = new Image(); 177 178 EXIF.getData(fileData, function(){ 179 orientation = fileData.exifdata.Orientation; 180 }); 181 182 reader.onload = function() { 183 184 image.onload = function() { 185 186 var fd = new FormData(); 187 var image_aspect,canvas_width,canvas_height,draw_width,draw_height; 188 //アスペクト取得 189 image_aspect = (orientation == 5 || orientation == 6 || orientation == 7 || orientation == 8) ? image.width / image.height : image.height / image.width; 190 191 canvas_width = 300; 192 canvas_height = Math.floor(300 * image_aspect); 193 194 //canvasの縦横サイズを指定 195 canvas.width = canvas_width; 196 canvas.height = canvas_height; 197 $('#preview1').width(canvas_width); 198 $('#preview1').height(canvas_height); 199 200 //描画サイズを指定 201 draw_width = canvas_width; 202 draw_height = canvas_height; 203 204 switch(orientation){ 205 206 case 2: 207 ctx.transform(-1, 0, 0, 1, canvas_width, 0); 208 break; 209 210 case 3: 211 ctx.transform(-1, 0, 0, -1, canvas_width, canvas_height); 212 break; 213 214 case 4: 215 ctx.transform(1, 0, 0, -1, 0, canvas_height); 216 break; 217 218 case 5: 219 ctx.transform(-1, 0, 0, 1, 0, 0); 220 ctx.rotate((90 * Math.PI) / 180); 221 draw_width = canvas_height; 222 draw_height = canvas_width; 223 break; 224 225 case 6: 226 ctx.transform(1, 0, 0, 1, canvas_width, 0); 227 ctx.rotate((90 * Math.PI) / 180); 228 draw_width = canvas_height; 229 draw_height = canvas_width; 230 break; 231 232 case 7: 233 ctx.transform(-1, 0, 0, 1, canvas_width, canvas_height); 234 ctx.rotate((-90 * Math.PI) / 180); 235 draw_width = canvas_height; 236 draw_height = canvas_width; 237 break; 238 239 case 8: 240 ctx.transform(1, 0, 0, 1, 0, canvas_height); 241 ctx.rotate((-90 * Math.PI) / 180); 242 draw_width = canvas_height; 243 draw_height = canvas_width; 244 break; 245 246 default: 247 break; 248 } 249 250 //canvasを表示 251 $('#preview1').show(); 252 253 //canvasに画像を描画 254 ctx.drawImage(image, 0, 0, draw_width, draw_height); 255 } 256 image.src = reader.result; 257 } 258 reader.readAsDataURL(fileData); 259 }); 260}); 261</script> 262</body> 263</html>

php

1upload.php 2 3<?php 4if(count($_FILES)>0 and count(array_filter($_FILES,function($x){return $x["error"]>0;}))==0){ 5 6 // 画像データ 7 $id=filter_input(INPUT_POST,'id'); 8 $img1 = file_get_contents($_FILES['img1']['tmp_name']); 9 10try{ 11$dsn = 'mysql:dbname=article;host=localhost;charset=utf8'; 12$user = 'root'; 13$password = ''; 14$pdo = new PDO($dsn, $user,$password); 15$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 16$sql = 'INSERT INTO 17`image` (id, img1) 18VALUES 19(:id, :img1)'; 20 21$stmt = $pdo->prepare($sql); 22$stmt->bindValue(':id', $_POST['id']); 23 24$stmt->bindValue(':img1', $img1); 25$stmt->execute(); 26}catch(PDOException $e){ 27die($e->getMessage()); 28} 29} 30 31?>

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

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

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

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

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

m.ts10806

2019/04/21 03:07 編集

>他の方の質問などを参考に仕組んでみたのですが登録できず その参考にした質問と、このコードで実際に起きている問題をご提示ください。(エラーが出るとか単に「できない」だけではなく何かしら起きていると思います。どこまで想定通り動いているかのデバッグもしてみてください) また「Canvasの中身を」と仰いますが、コードだけで質問者さんがやろうとしている要件や仕様までくみ取るのは困難です。 どのような仕様で作ろうとしているのか、そのあたりを具体的に記載してください。それ次第でやろうとしていることよりも適切なやり方をアドバイスできるかもしれません
redkick

2019/04/21 03:31

言葉足らず過ぎて大変失礼致しました。 追記させていただきましたのでご確認いただけたらと思います。
m.ts10806

2019/04/21 09:22

1点確認いただきたいのですが、type=fileの情報を送信しているわけではないので$_FILESに情報が入らないのでは?という気がするので$_POSTの内容も確認してみてください。 $_POST[img1]の内容ですね。
redkick

2019/04/21 09:55

てっきりtype=fileで送信されているものだと思い込んでおりました・・ POSTの内容確認では確かに数値自体が入っておらず、そこから足掛かりにして探れそうですので 再度チャレンジしてみたいと思います。 ありがとうございました。
m.ts10806

2019/04/21 12:55

私のほうでも何かしら試してみます(試すのが明日になりそうです) 「ファイルアップロード」自体ができてなさそうですし、canvasでやりたいことによってはPHP側でGDライブラリなどを用いて対応可能な可能性もあります。(リサイズとか文字載せるくらいならたぶんそこまで難しくないです)
m.ts10806

2019/04/21 12:56

例えば、画像アップロード自体は普通にしておいて、 「どういうサイズにリサイズするか」「どういう文字をどこに配置するか」の情報を一緒にPOSTするとあとはサーバー側でcanvasでしたのと同じ画像加工ができそうにも思います。
redkick

2019/04/22 06:16

お返事をいただけていたのに気付かず新たに質問として類似の投稿をしてしまい大変失礼致しました。 調べて試しての繰り返しでも、理解が得られず取っ掛かりが欲しくてついやってしまいました。。 確かに、アップロード自体は出来たので受け取った後に同様の処理をすれば同じですね。 そちらで試してみたいと思います!
m.ts10806

2019/04/22 06:17

先の質問を削除依頼だされたほうが良いと思います。 質問を編集したり回答がついたりすると「アクティブ」タブにあがってきます。 ちょっと思うところを回答にしています。
redkick

2019/04/22 06:32

削除依頼を出させていただきました。 ご迷惑をお掛け致しました。
m.ts10806

2019/04/22 06:33

いえいえ私は特に迷惑と思ってませんよ。teratail的にそれが推奨される手続きなのですすめただけです
guest

回答1

0

画像変換でよく用いられるBlobもbase64も言ってしまえば文字情報なので$_POSTで受け取るものと思います。
画像自体が送信前に正しく(想定通りに)変換されているかどうかを確認してみてください。
fd.append('img1', canvasBlob);のcanvasBlob。

あとは保存先のテーブルのカラムがblobを保存するのに十分な桁数や型になっているかは大事です。

投稿2019/04/22 06:19

m.ts10806

総合スコア80848

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

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

redkick

2019/04/22 06:50

仕事の合間に勉強しておりまして、思うように進められませんが まずはBlobについての見識を深めてみたいと思います。 いろいろとありがとうございます。
m.ts10806

2019/04/22 06:52

いえいえ。大変かと思いますが頑張ってください。 「送る前のデータが想定通りか」の確認からですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問