0

わかりましたので、私のphp Webサービスに画像を送信するAndroidアプリを手に入れました。

を使用して base64 文字列をデコードしbase64_decode()ました。ただし、SQL クエリを実行してデータをデータベースに挿入すると、スクリプトはこの文字列を挿入します\x5265736f75726365206964202333

私が知りたいのは、コードを変更してその文字列を画像に変換し、UTF8エンコーディングとbytea画像を格納するためのデータ列タイプを持つ PostGreSQL データベースに挿入する方法です。

PHP スクリプト

header('Content-Type: text/plain; charset=UTF-8');
$conn = pg_connect("database_string");

 /* GET DATA */
$name = $_POST['name'];
$s_name = pg_escape_string($name);
$description = $_POST['desc'];  
$s_desc = pg_escape_string($description);
$latitude = $_POST['lat'];
$longitude = $_POST['lng'];
$project = $_POST['project'];

$encoded_photo = $_POST['snap'];
$photo = base64_decode($encoded_photo);
header('Content-Type: image/jpeg; charset=utf-8');
$file = fopen('uploaded_image.jpg', 'wb');
fwrite($file, $photo);
fclose($file);

 /* INSERT INTO DATABASE */
$res = pg_query("INSERT INTO records (photo, name, description, latitude, longitude, project) VALUES ('$file', '$s_name', '$s_desc', '$latitude', '$longitude', '$project')");

私は自分の意図した解決策に近づいていることを知っています。デコードされたbase64文字列を挿入して挿入していると思いますが、Androidアプリで撮影した元の画像に変換する最終ステップがありません。Android dev'ing の新機能についてお詫び申し上げます。

4

2 に答える 2

1

この部分:

$file = fopen('uploaded_image.jpg', 'wb');
fwrite($file, $photo);
fclose($file);

 /* INSERT INTO DATABASE */
$res = pg_query("INSERT INTO records (photo, name, description, latitude, longitude, project) VALUES ('$file', '$s_name', '$s_desc', '$latitude', '$longitude', '$project')");

意味がありません。PHP ファイルハンドルを挿入しています。Resource id #3PHPのように文字列に変換されてから、に変換されbyteaます。あなたが望むものではありません。

データは既にメモリ内にあるため、そもそもファイルにデータを書き込む必要はまったくありません。パラメータ化されたクエリを使用するだけで (常にパラメータ化されたクエリを使用する必要があります)、次の方法で DB ドライバーに処理させますpg_query_params

$res = pg_query_params(
       'INSERT INTO records (photo, name, description, latitude, longitude, project) VALUES ($1, $2, $3, $4, %6, $6)',
       array( pg_escape_bytea($photo), $s_name, $s_desc, $latitude, $longitude, $project)
);

のドキュメントをpg_query_params参照してください。

bytea エスケープについてはpg_escape_bytea、 およびを参照してくださいpg_unescape_bytea。これらの関数はかなり時代遅れでありhex、出力でエスケープを正しく認識しない場合があることに注意してください。問題がある場合は、 にSET bytea_output = 'escape';値をフェッチする前にSQL コマンドを発行してpg_unescape_byteaください。

PHP が実際にすべきことは、クエリの最初のパラメーターのデータ型が、テキストではなく生のバイトとしてbytea挿入する必要があることを推測することであるという事実を利用することです。$photoあなたのコメントから、これを行うには十分に賢くないように思えます。

ところで、パラメータ化されたステートメントを常に使用する必要がある理由を理解するには、この Web サイトを読む必要があります。SQL インジェクションおよびSQL インジェクションに関する PHP マニュアルを参照してください。より安全であることに加えて、パラメーター化されたステートメントは正しく理解するのが簡単で、多くの場合より高速です。

于 2013-05-13T07:08:38.080 に答える