2012-05-23 176 views
1

我有一個使用Amazon S3存儲文件的應用程序。我遇到了一個問題,一個大的PDF不能用chrome下載。較小的PDF文件效果很好,但這個較大的文件不起作用。我不相信這是PDF的問題,我懷疑它與文件的大小有關。如何強制使用Amazon SDK for PHP從Amazon S3下載文件?

當觀看在這裏瀏覽器中的文件是我使用的代碼:

header("Content-type: $filetype"); 
header("Content-Disposition: filename=\"".$filename."\""); 
$response = $s3->get_object(AMAZON_BUCKET, $filepath); 
echo $response->body; 

這個偉大工程的文件較小,但今天我遇到了這個地方大型PDF不會顯示的問題。我在想這個文件太大而無法渲染。因此,我決定嘗試強制下載文件,而不是在瀏覽器中查看它們是否太大。所以這裏是我想要工作的代碼,但是我一定是做錯了,因爲它不工作。

$response = $s3->get_object(AMAZON_BUCKET, $filepath, array(
     'response' => array(
     'content-type' => $filetype, 
     'content-disposition' => 'attachment' 
     ) 
    )); 

如何使用Amazon的SDK PHP強制文件下載?

+0

如果文件太大,可能是您的PHP腳本內存不足。你是否檢查過錯誤日誌(或已啓用的顯示錯誤?你有沒有得到一個「迴應」?更多關於它的中斷位置的線索可能會有所幫助。 – Robbie

+0

我正在將內存增加到82M。我有問題的文件是43 mb。 – Jason

+0

問題的另一部分:你能否更明顯地拒絕服務器的症狀?你是否從服務器獲得任何迴應 - 500錯誤,「警告」或「通知」。日誌中的任何內容? – Robbie

回答

1

您的方法存在的問題是您將整個文件從S3下載到您的網絡服務器的內存,然後將其發送到用戶的瀏覽器。如果文件很大,則可能會導致超過memory_limit甚至max_execution_time。 (不可否認,我不知道爲什麼你的情況是特定於Chrome的。)

更優雅的方式是重定向用戶直接從S3下載文件。您甚至可以將set custom headers作爲您的請求的一部分,以便您可以強制下載對話框。使用get_object_url()而不是get_object()

+0

感謝您的建議。我想我會重新思考我這樣做的方式。但有趣的問題是,當我從get_object_url中獲取從amazon返回的url並將該url置於chrome中時,它將被瀏覽器取消。如果我在safari中做同樣的事情,它會下載文件。你有什麼想法爲什麼鉻不會下載它和Safari? – Jason

+0

我添加了頭文件,並用chrome修復了問題。 – Jason