2

幾行(如下)生成簽名的URL,瀏覽器被重定向到S3下載文件。AWS S3:使用'response-content-disposition'強制文件下載

當內容類型設置爲Octet Stream時,我正面臨着着名的Chrome瀏覽器未從S3下載PDF文件的問題。

解決方案是強制使用chrome下載文件,而不是嘗試讀取/打開它。

我嘗試添加'response-content-disposition'來標記以及URL,但它沒有奏效。

如何在生成url時使用'response-content-disposition'標題?

String codedFilename= EncodingUtil.urlEncode(bucketPath,'UTF-8'); 

    String stringtosign = 'GET\n\n\n'+Lexpires+'\n/'+bucketName+'/'+codedFilename; 

    String signed = make_sig(stringtosign); 

    String codedsigned = EncodingUtil.urlEncode(signed,'UTF-8'); 

    String url = serverURL+'/'+bucketName+'/'+codedFilename+'?AWSAccessKeyId='+awskey+'&Expires='+Lexpires+'&Signature='+codedsigned; 

注意: - 這是salesforce-apex語法。

+0

自定義標頭在文件本身上設置。這些頭文件將在下載文件時發送到客戶端。我相信你只能在文件第一次上傳的時候這樣做。 – datasage

+0

@datasage,S3文檔沒有爲PUT請求指定'response-content-type'標籤。因此,我認爲我們無法在上傳時設定該標題(但我可能會錯誤) –

回答

3
String codedFilename= EncodingUtil.urlEncode(bucketPath,'UTF-8'); 

    String stringtosign = 'GET\n\n\n'+Lexpires+'\n/'+bucketName+'/'+codedFilename+'?response-content-disposition=attachment; filename=abc.doc'; 

    String signed = make_sig(stringtosign); 

    String codedsigned = EncodingUtil.urlEncode(signed,'UTF-8'); 

    String url = serverURL+'/'+bucketName+'/'+codedFilename+'?response-content-disposition='+EncodingUtil.urlEncode('attachment; filename=abc.doc','UTF-8')+'&AWSAccessKeyId='+awskey+'&Expires='+Lexpires+'&Signature='+codedsigned; 

來源:Unable to override content disposition header in s3

鉻有問題,如果內容類型是 '應用程序/八位字節流' 爲一個文件(PDF INT這種情況下)。但是,如果內容類型是'binary/octet-stream',那麼chrome是OK的。

謝天謝地S3默認如果在上傳的時候沒有設置內容類型的下載到'binary/Octet-stream'。

我的建議: - 如果在上傳時不需要知道內容類型,就需要將'any'類型的文件存入S3中,只需不要設置它或將其設置爲'binary/Octet-stream'。這種方式Chrome會顯示警告,但文件已下載。