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

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

ただいまの
回答率

90.40%

  • PHP

    24993questions

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

  • JavaScript

    21483questions

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

  • MySQL

    7280questions

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

  • Monaca

    1156questions

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

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 586

seri

score 386



送信は以下のような実装でして、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();
     }

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 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 18:28

    通知が来るたびありがたく感謝しております。
    使っているデータベースではNULLの場合はNULL表記になります

    ::確実に言えるのは、いくら画像ファイルをPOSTメソッドで送信しているとしても、PHP受信側では$_FILESを使わないとアクセス出来ません。

    との事ですが、データベースに文字列のデータ型として保存し、クライアント側ではデータコードを受け取ってPNG形式に戻すといった事が出来ないかと思っていまして、この場合でも$_FILEは必須でしょうか?
    POSTで送るデータがほかにもあるため(nameやpass等)画像を送る際も
    (サーバー側、データ受け取り時のPHP)
    $img =file_get_contents($_POST['img']);

    としています。

    キャンセル

  • 2017/04/28 18:32

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

    キャンセル

  • 2017/04/29 14:26 編集

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

    キャンセル

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

  • ただいまの回答率 90.40%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    24993questions

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

  • JavaScript

    21483questions

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

  • MySQL

    7280questions

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

  • Monaca

    1156questions

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