2015-08-26 193 views
1

只是爲了記錄,這是用Wordpress完成(我沒有選擇它,也沒有將圖像存儲在數據庫中)。破解圖像檢索BLOB與PHP

基本上我試圖存儲和使用PHP數據庫中的圖像,稍後顯示它,但我得到一個破碎的圖像圖標。 (相信我,我一直在研究這一點,我無法找到問題所在)。

這是我的店面形象:

HTML:

<input type="file" name="img" id="media"> 

PHP:

$item['media'] = addslashes (file_get_contents($_FILES['img']['tmp_name'])); 
$result = $wpdb->insert($table_name, $item); 

這是IM如何試圖找回它:

HTML:

<img src="Image_View.php?image_id=<?php echo $item["item_id"]; ?>"/> 

Image_View.PHP:

<?php 
    global $wpdb; 
    $result = $wpdb->get_row("SELECT media FROM $wpdb->item WHERE item_id = 3", ARRAY_A); 
    header("content-type: image/png"); 
    echo $result["media"]; 
?> 

BTW!這是我在Stackoverflow的第一個問題!所以大家好!


編輯1:

正如hanshenrik提到,$ wpdb->插件逃脫輸入,所以我上載,然後像上面寫磁盤,設置適當的exntension和BOOM你去那裏,現在我知道我其實上傳圖像的正確方法,但它看起來像IM仍然在遇到問題時試圖證明它,使用Chrome的開發者工具,即時得到這個時候:

GET http://127.0.0.1/pymes/wp-admin/Image_View.php 500(內部服務器錯誤)

那麼,Image_View.php有問題嗎?該查詢實際上是好的,並且正在檢索數據,因爲我在另一個位置複製並粘貼了該代碼,並且它在bin文件內部響應了整個lote字符。


編輯2:

一次!對此深感抱歉,我一直在努力

因此,解決上傳圖片時出現問題的解決方法已在編輯1中解釋(感謝hanshenrik提示wpdb插入正在轉義輸入)。

至於顯示,我是有接頭的煩惱圖像發送之前它可能使它到:

header("content-type: image/png"); 

,所以我在這個掙扎,我決定使用URI的形象,這解決了嘗試我的問題。對我而言,這更像是一種解決方法,而不是一種實際的解決方法,但它讓我的船浮上水面。我實現URI的方式如下:

<?php 
global $wpdb; 
$result = $wpdb->get_row("SELECT media FROM $wpdb->item WHERE item_id = $_GET[id]", ARRAY_A); 

echo '<img src="data:image/png;base64,'.base64_encode($result['media']).'" height="100" width="100"/>'; 
?> 

通過這樣做,我不再需要Image_View.php文件。

真的很感謝這裏提供的幫助,TY們!

+2

嗨回來!我認爲最有可能的是圖像已被'addslashes(file_get_contents($ _ FILES ['img'] ['tmp_name']));'當你存儲它 – RiggsFolly

+0

我想我可能已經轉換圖像到'base64',然後存儲,如果我不得不在MYSQL數據庫上存儲圖像。 [見此](http://stackoverflow.com/questions/3967515/how-to-convert-image-to-base64-encoding) – RiggsFolly

+0

簡單測試,從數據庫中讀取blob,用正確的extn寫入磁盤。如果你無法用圖像查看器打開它,那麼它就會被商店的進程擱置。 – RiggsFolly

回答

0

所以,我的問題的解決方案(感謝hanshenrik提示wpdb插入是逃避輸入)。

關於表示,我是有頭的麻​​煩的圖像被髮送之前,它可以使其向:

標題(「內容類型:image/PNG」); 所以我在這方面掙扎,我決定嘗試使用URI來解決我的問題。對我而言,這更像是一種解決方法,而不是一種實際的解決方法,但它讓我的船浮上水面。我實現URI的方式如下:

get_row(「SELECT media FROM $ wpdb-> item WHERE item_id = $ _GET [id]」,ARRAY_A);

echo''; ?> 通過這樣做,我不再需要Image_View.php文件。

真的很感謝這裏提供的幫助,TY們!

0
$item['media'] = addslashes (file_get_contents($_FILES['img']['tmp_name'])); 
$result = $wpdb->insert($table_name, $item); 

addslashes?你瘋了嗎?如果$ wpdb-> insert不能爲你轉義,請使用適當的SQL轉義函數。

無論如何,與您現有的代碼,這可能會在上傳該圖片已編輯1被解釋工作..

echo stripslashes($result["media"]); 

或許

echo htmlspecialchars(stripslashes($result["media"])); 
+0

哇!看起來像你釘了它!顯然$ wpdb-> insert確實可以逃脫數據!也許這是麻煩=#生病試試這個! – StormRage

+0

數據: (數組)要插入的數據(在列=>值對中)。 $ data列和$ data值都應該是「原始的」(兩者都不應該被SQL轉義)。從wp codex – StormRage

+0

行!到目前爲止這麼好,我跳過addslashes,現在當我寫入磁盤的形象,並設置適當的擴展我可以看到它(我以前不能做的事情!) – StormRage