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

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

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

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

PHP

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

JavaScript

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

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

Q&A

1回答

1574閲覧

Mysqlで画像を使った際、送受信が正しく出来ません。

seri

総合スコア422

MySQL

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

PHP

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

JavaScript

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

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

0グッド

0クリップ

投稿2017/04/28 05:58

送信は以下のような実装でして、HTTP側のIMGをくりっくしたらgetPhotoが呼び出されます。

<img id="setImg" onclick="getPhoto();">

送信

var img; function getPhoto () { navigator.camera.getPicture(onSuccess, onFail, { quality: 50,destinationType: Camera.DestinationType.FILE_URI,encodingType:Camera.EncodingType.PNG, sourceType: navigator.camera.PictureSourceType.SAVEDPHOTOALBUM}); } function F(){ var xhr = new XMLHttpRequest(); xhr.open("POST","http://111.11.11.11/P.php",false); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.withCredentials = true; xhr.addEventListener("load", function(e){ }); var data ="_img="+img; xhr.send(data); } function onSuccess (imgUri) { return new Promise(function(resolve, reject) { window.resolveLocalFileSystemURL(imgUri, function success(fileEntry) { fileEntry.file(function(file){ var reader = new FileReader(); reader.onloadend = function(evt) { var blob = new Blob([evt.target.result], {type: "application/octet-binary"}); img=blob; }; reader.readAsArrayBuffer(file); }, function() {console.log(error);}); }, function() {console.log(error);}); })

送信後受け取りのサーバーでは以下のような実装です

$con = new PDO('mysql:host=HOST;dbname=DD;charset=utf8','USER','PASS', array( PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>true, PDO::ATTR_EMULATE_PREPARES=>false, PDO::ATTR_STRINGIFY_FETCHES=>false)); if(isset($_POST['_img'])){ $img=file_get_contents($_POST['_img']); $sql=<<<SQL insert into imgfile(img)values(:i) SQL; $stmt = $con->prepare($sql); $stmt->bindValue(':i',$img); $stmt->execute(); $stmt->close(); }

ここでデータベースをdescで確認するとIncertは成功していますが、Imgのフィールドは空白となっています。

次に取得ですが.
クライアント側

function R(){ var id=1; var xhr = new XMLHttpRequest(); xhr.open("POST","http://111.11.11.11/P.php",false); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.withCredentials = true; xhr.addEventListener("load", function(e){ var ssss = document.getElementById("setImg"); ssss.src=(xhr.responseText); }); var data ="_id="+id; xhr.send(data); }

サーバ側

if(isset($_POST['_id'])){ $id=$_POST['_id']; $sql=<<<SQL select img from imgfile where id= :id SQL; $smst=$con->prepare($sql); $smst->bindValue(':id',$id,PARAM_INT); $smst->execute(); $result=$smst->fetch(); $ret_img =$result['img']; header('Content-type:','image/png'); echo $ret_img; $stmt->close(); }

一応サーバーとのやり取り、データベースへの接続は出来ていますが、画像の拡張子等が上手くいっていないのかな。。。といった所で煮詰まってしまいました、お力を貸してください。

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

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

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

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

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

guest

回答1

0

(マイナス評価をいただきましたので、ポイントを押さえた箇所のみにします。)


POSTで画像を送るときのnameが'_img'なのだとすると、
受信側phpで解釈するのに$_FILES['_img']でアクセスするので、
$_FILES['_img']['tmp_name']に仮置きしているファイルがあるはずです。
is_uploaded_file()にて
アップロードされたファイルが存在するかを確認してから、
$img=file_get_contents($_FILES['_img']['tmp_name']);
じゃないかなぁと。
$stmt->bindParam(':i',$img);
で変数に格納しているデータを引き渡す必要もありますね。

これで画像ファイルを格納できないでしょうか。

投稿2017/04/28 06:12

編集2017/04/28 09:02
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

seri

2017/04/28 06:31

バイナリデータとして登録し、受信の際はバイナリデータから出力する予定です 以下のサイトを参考にしています http://joyplot.com/documents/2016/10/06/php-mysql-image/ http://www.kantenna.com/pg/2010/04/phpmysql.php 数字の1に関してはただのタイプミスです。 質問文のコードではデータの格納から受信はうまくいっています。 つまりは、一時ファイルに格納する工程が抜け居ていたとゆう事でいいのでしょうか?
退会済みユーザー

退会済みユーザー

2017/04/28 07:39

PHP: POST メソッドによるアップロード - Manual <http://php.net/manual/ja/features.file-upload.post-method.php> こちらを元に、ファイルアップロード時の受信側処理をどうするか確認すると良いのではないでしょうか。
seri

2017/04/28 07:56

ちょっと具体的すぎてわかりません・・
退会済みユーザー

退会済みユーザー

2017/04/28 08:34

ポイントを押さえたものを回答文中に加筆していますので、ご確認お願いします。
seri

2017/04/28 08:51

この話だと、質問文でのコードはImgが格納されていないとゆう解釈になります。 一応ファイルの読み込みと格納は質問文のコードでも出来ているようでして、ただ、最後に画像として出力する際にちゃんと出力されないとゆう意味です。
退会済みユーザー

退会済みユーザー

2017/04/28 08:52

「Imgのフィールドは空白となっています」とあったので、その点についての回答となっております。
seri

2017/04/28 08:53

データベースに格納する際にわざわざ一時ファイルに保存する意味もわかりません 純粋に $img=file_get_contents($_FILES['_img']);で良い気がします。。 そこを変更しても、解決にはつながるとは・・
seri

2017/04/28 08:56

:「Imgのフィールドは空白となっています」とあったので、その点についての回答となっております。 MYSQLの仕様でそういった表記になっているのかもしれなく、不安とゆう意味です。。これも原因の一つなのかも聞いてみたく記述しておりました。
退会済みユーザー

退会済みユーザー

2017/04/28 09:11

blob型は普通に視認できない(データベースツールによってはへんてこな表示になりうる)かもしれませんね。でも空白ということはnullかもしれません。 視認するためにはTEXT型などに強引に変換を噛ませないと行けません: MySQLのBLOBをテキストに変換する方法 - ITの隊長のブログ <http://www.aipacommander.com/entry/2015/06/25/182335> 確実に言えるのは、いくら画像ファイルをPOSTメソッドで送信しているとしても、PHP受信側では$_FILESを使わないとアクセス出来ません。 (回答を投稿してから何度も修正を加えており、通知がうるさいかもしれません、お詫びします。)
seri

2017/04/28 09:28

通知が来るたびありがたく感謝しております。 使っているデータベースではNULLの場合はNULL表記になります ::確実に言えるのは、いくら画像ファイルをPOSTメソッドで送信しているとしても、PHP受信側では$_FILESを使わないとアクセス出来ません。 との事ですが、データベースに文字列のデータ型として保存し、クライアント側ではデータコードを受け取ってPNG形式に戻すといった事が出来ないかと思っていまして、この場合でも$_FILEは必須でしょうか? POSTで送るデータがほかにもあるため(nameやpass等)画像を送る際も (サーバー側、データ受け取り時のPHP) $img =file_get_contents($_POST['img']); としています。
退会済みユーザー

退会済みユーザー

2017/04/28 09:32

PHP: POST メソッドによるアップロード - Manual <http://php.net/manual/ja/features.file-upload.post-method.php> の繰り返しになりますが、文字データを受信するなら$_POSTですが、バイナリーデータ(画像ファイル)を受信するには$_FILESを使います。 バイナリデータ以外は$_POSTに納まるため、'_id'は普通に$_POSTを参照すると良いです。
seri

2017/04/29 05:26 編集

POSTの際以下のような形で送っているのですがここにバイナリファイルを含ませてサーバでFILESととることは可能でしょうか? var name="Jon"; var img;//blob var xhr = new XMLHttpRequest(); xhr.open("POST","http://",false); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.addEventListener("load", function(e){}); var data ="name="+name+"&img="+img; xhr.send(data);
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問