2013-08-06 75 views
1

我有不正確地存儲在S3與MIME類型的application/octet-stream一些圖像。當我把這個圖像的網站上有一個錨,即<a href="imgurl",圖像被自動下載,而不是在瀏覽器中被查看。強制錨點href將八位字節流視爲圖像?

反正是有解決此問題,並迫使瀏覽器處理的鏈接作爲一個形象呢?

+1

你可以修復文件的存儲方式嗎?如果沒有,我建議代理請求。 – Brad

+0

@Brad,是的,最終我認爲糾正文件存儲是處理這個問題,但我想知道是否有暫時的解決方法。 –

回答

1

我不知道爲什麼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); 
+0

這是一個很好的建議。我使用的是Grails而不是PHP,但我想我可以像上面的代碼一樣工作。 –

+0

@JamesMcMahon這應該是可行的。兩個重要的安全方面:創建白名單(文件和/或目錄)並注意文件路徑中可能的「..」。 – ComFreek

+0

我打算假設這意味着沒有純粹的客戶端解決方法,並將其標記爲答案。謝謝! –

相關問題