我有不正確地存儲在S3與MIME類型的application/octet-stream
一些圖像。當我把這個圖像的網站上有一個錨,即<a href="imgurl"
,圖像被自動下載,而不是在瀏覽器中被查看。強制錨點href將八位字節流視爲圖像?
反正是有解決此問題,並迫使瀏覽器處理的鏈接作爲一個形象呢?
我有不正確地存儲在S3與MIME類型的application/octet-stream
一些圖像。當我把這個圖像的網站上有一個錨,即<a href="imgurl"
,圖像被自動下載,而不是在瀏覽器中被查看。強制錨點href將八位字節流視爲圖像?
反正是有解決此問題,並迫使瀏覽器處理的鏈接作爲一個形象呢?
我不知道爲什麼MightyPork刪除了他的答案,但基本的想法是在PHP中創建一個代理,它將爲您提供正確的MIME類型的文件。
<?php
function error403() {
header('HTTP/1.0 403 Forbidden');
die('You are not allowed to access this file.');
}
function serveFile($file, $mimeType) {
header('Content-Type: ', $mimeType);
header('Content-Length: ', filesize($file));
readfile($file);
}
function determineMimeType($file) {
$mimeMap = array(
'png' => 'image/png',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'gif' => 'image/gif'
);
$fileExt = strtolower(pathinfo($path, PATHINFO_EXTENSION));
if (isset($mimeMap[$fileExt])) {
return $mimeMap[$fileExt];
}
return false;
}
// entry point
$whitelist = array('test1.png', 'test2.png');
$filePath = isset($_GET['file']) ? $_GET['file'] : error403();
if (!in_array($filePath, $whitelist)) {
error403();
}
$mime = determineMimeType($filePath);
if ($mime === false) {
// error handling, logging, etc.
}
serveFile($filePath, $mime);
這是一個很好的建議。我使用的是Grails而不是PHP,但我想我可以像上面的代碼一樣工作。 –
@JamesMcMahon這應該是可行的。兩個重要的安全方面:創建白名單(文件和/或目錄)並注意文件路徑中可能的「..」。 – ComFreek
我打算假設這意味着沒有純粹的客戶端解決方法,並將其標記爲答案。謝謝! –
你可以修復文件的存儲方式嗎?如果沒有,我建議代理請求。 – Brad
@Brad,是的,最終我認爲糾正文件存儲是處理這個問題,但我想知道是否有暫時的解決方法。 –