2015-06-17 51 views
1

爲了簡單起見,我試圖使用php來顯示圖像,以幫助嘗試並防止任何類型的安全漏洞。我已經通過一個PHP腳本讀取圖像,我想要渲染它,所以我不想去http://example.com/path/to/uploads/dir/image.jpg,我想讓用戶能夠去http://example.com/path/to/script/image1,並讓他們能夠看到圖像。獲取圖像以使用php呈現

這樣我就可以將圖像路徑(http://example.com/path/to/uploads/dir/)隱藏在我的文檔根目錄之外(無法由域路徑完全訪問)。因此,如果域的路徑是/path/to/public_html/,那麼我需要將圖片上傳到/path/to/uploads/,以便在衝浪我的域時無法導航到上傳目錄。

我的問題是圖片我一直渲染,不會渲染,我不確定爲什麼。 MD5校驗和是相同的,並且HTTP頭是相似的。圖像的direct path,與圖像的desired path相比。

我使用Laravel作爲一個框架/骨幹網,但我不認爲要多,我的代碼的問題要呈現的圖像低於

public function getImage($id){ 
    $img = TitanImage::findOrFail($id); 
// header('Content-type: image/jpeg'); 
// header('Content-Length: ' . filesize($img->path)); 
// header('Accept-Ranges: bytes'); 
// echo file_get_contents($img->path); 
    $file = $img->path; 
    $type = 'image/jpeg'; 
    header('Content-Type:'.$type); 
    header('Content-Length: ' . filesize($file)); 
    readfile($file); 
// exit(); 
    return; 
} 

我也用webconfs檢查的頭兩個所需的圖像端點。

編輯1

在問候有關intervention/image包,我改變了我的代碼,我仍然得到同樣的結果,意見之一;然而,內容長度已經改變,它變得更長了。

public function getImage($id){ 
    $img = TitanImage::findOrFail($id); 
// header('Content-type: image/jpeg'); 
// header('Content-Length: ' . filesize($img->path)); 
// header('Accept-Ranges: bytes'); 
    $file = $img->path; 
    return Image::make(trim($file,' '))->response(); 
} 

編輯2

在此編輯,@Digitlimit提到的檢查,看是否存在圖像。這是我現在的代碼。

public function getImage($id){ 
    $img = TitanImage::findOrFail($id); 
    $file = $img->path; 
    if(file_exists($file)) 
    return Image::make($file)->response('jpg'); 
    else 
    return 'File doesnt exist'; 
} 

我也做了測試,看看如果我只是返回$file代替Image::make情況下會發生什麼,我得到了正確的路徑,即。當我去SSH到服務器和cd到路徑減去圖像名稱路徑存在和有權限。當我執行ls -la命令時,它會列出圖像並且它也具有適當的權限。

+0

錯誤的術語。 「在我的域名後面」。它應該是「在我的文檔根目錄之外」。 –

+0

謝謝,我修正了 –

+0

爲什麼不使用干預圖像它的真棒。看到這個答案類似的問題:http://stackoverflow.com/questions/30875139/cant-get-images-from-storage-laravel-5/30882720#30882720 – Digitlimit

回答

2

該代碼正在工作 - 問題是它的發送額外信息。該文件那裏,它發現,它被髮送。你的形象返回link:

HTTP/1.1 200 OK 
Date: Wed, 17 Jun 2015 22:52:03 GMT 
Server: Apache 
Connection: close 
Content-Type: image/jpeg 

但隨後的輸出是錯誤

00000050 3a 20 63 6c 6f 73 65 0d 0a 43 6f 6e 74 65 6e 74 |: close..Content| 
00000060 2d 54 79 70 65 3a 20 69 6d 61 67 65 2f 6a 70 65 |-Type: image/jpe| 
00000070 67 0d 0a 0d 0a 20 ff d8 ff e1 19 57 45 78 69 66 |g.... .....WExif| 
         ^^ 
          `this 20 here, before the ff d8 ff of JPEG. 

所以這個代碼(即只對JPEG部分負責)就可以了。

public function getImage($id){ 
    $img = TitanImage::findOrFail($id); 
    $file = $img->path; 
    if (file_exists($file)) { 
     return Image::make($file)->response('jpg'); 
    } 
    else { 
    return "File doesn't exist"; 
    } 
} 

在數據流開頭的額外空間可能來自一個額外的空格一些PHP文件開幕<?php標記之前,或關閉標籤後,也許。

對於後者,建議您不要關閉<?php標記,即您從不包含「?>」序列。

對於前者,儘量

public function getImage($id) { 
    return "*** is there a space before the asterisks?"; 
} 

,並觀察返回的HTML。除非錯誤出現在TitanImage中,我認爲這不太可能,否則在JPEG圖像之前發送的星號前應該看到相同的空格。定義getImage()函數的文件可能是一個嫌疑犯。

否則,您可以運行「grep」來查找執行的PHP文件而不是<?php開頭。您可以通過將-v標誌添加到grep來修改此shameless plug

+0

一旦我明天回到項目的工作,並讓你知道未來,我會嘗試這個。 –

+0

我只是仔細檢查了泰坦項目的每個文件,你知道什麼。 '<?php'之前的路線文件中有一個空格,我真的很感謝你@Iserni。 –

+0

不客氣。如果你知道它發生了多少次...... :-D – LSerni

0

如果您已經安裝了干預圖像,然後做到這一點:

public function getImage($id){ 
    $img = TitanImage::findOrFail($id); 
    $file = $img->path; 
    return Image::make($file)->response('jpg'); 
} 

編輯: 我測試了這對我的項目,它完美的作品:

路線:

Route::get('/api/v1/titan/image/{id}',function($id){ 
    return \Image::make(storage_path("/images/$id.jpg"))->response('jpg'); 
}); 

我的項目中的圖像位置:

enter image description here

輸出當我訪問網址:http://laravel.dev/api/v1/titan/image/1

enter image description here

鉻元素檢驗 enter image description here

enter image description here

+1

這就是我正在做的。在我的我只是確保沒有空間。 –

+0

圖像路徑錯誤或無效。我將包含代碼來檢查文件是否存在。同時確保你已經啓用GD擴展 – Digitlimit

+0

我編輯我的問題,包括檢查,看看文件是否存在。我也確認GD擴展已啓用。 –