2013-05-13 31 views
0

好吧,所以我有一個Android應用程序,圖像到我的PHP Web服務。PHP的base64如何變成圖像插入數據庫

我使用base64_decode()解碼了我的base64字符串。但是,當我執行SQL查詢將數據插入數據庫時​​,腳本會插入此字符串\x5265736f75726365206964202333

我想知道的是如何修改代碼以將該字符串轉換爲圖像並將其插入到PostgreSQL數據庫中,該數據庫具有UTF8編碼和bytea數據列類型以存儲圖像。

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的新穎道歉。

+0

'\ x5265736f75726365206964202333'爲'Resource id#3' as text。所以我會說你沒有獲得自己的圖像數據,但有一些在你的網絡應用程序中處理它。 – 2013-05-13 04:59:17

+0

@CraigRinger我該如何利用這個句柄來查找圖像數據本身? – WebDevDanno 2013-05-13 07:00:11

回答

0

我成功地使用HTML + mySql編寫和調用base64圖像。

說到在HTML5

下面是我對數據庫

數據數據的例子:圖像/ PNG; BASE64,iVBORw0KGgoAAAANSUhEUgAAApQA

你需要把數據:圖像/ <圖像格式(PNG在我的情況)>

因此,在頁面中查看您需要添加 <img src=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApQA />

我希望這可以應用到您的項目。

+0

我不想在這個特定的腳本中查看它,只是將圖像插入到我的'bytea'列中。任何想法如何實現這一目標? – WebDevDanno 2013-05-13 06:59:30

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文件句柄。它被PHP轉換爲像Resource id #3這樣的字符串,然後轉換爲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) 
); 

the docs on pg_query_params

關於bytea轉義,請參見pg_escape_byteapg_unescape_bytea。請注意,這些功能相當落後於時間,並且可能無法在輸出上正確識別hex換碼;如果遇到問題,請在嘗試將值提取到pg_unescape_bytea之前發出SQL命令SET bytea_output = 'escape';

什麼PHP應該真的被使用的事實,查詢的第一個參數的數據類型爲bytea推斷,它必須插入$photo爲原始字節,而不是文本做。從你的評論看來,這聽起來不夠聰明。

順便說一句,你真的需要閱讀this website瞭解爲什麼參數化語句應該使用總是。見SQL Injectionthe PHP manual on SQL injection。除了更安全之外,參數化語句更容易正確並且通常更快。

+0

謝謝,但我得到了一個'無效的字節序列編碼UTF8:0xff'我該如何解決這個問題? – WebDevDanno 2013-05-13 07:30:59

+0

@DanielD是的,當然; PHP沒有'字節'的單獨數據類型,所以'pg_query_params'不知道它必須十六進制轉義數據。 PHP的PostgreSQL驅動相當落後,不支持十六進制轉義,所以你需要'SET bytea_output = escape;'然後使用'pg_escape_bytea'。查看更新 – 2013-05-13 07:40:21

+0

好吧...只是爲了檢查這一切,是在我已經實現了這個代碼'$ encoded_photo = $ _POST ['snap']; $ photo = base64_decode($ encoded_photo);'correct? – WebDevDanno 2013-05-13 07:47:57