簡體   English   中英

使用S3BotoStorage上傳到S3的文件最終會導致無效轉義的內容類型元數據

[英]Files uploaded to S3 with S3BotoStorage end up with invalidly escaped content-type meta data

FACEPALM UPDATE :事實證明我忘記/忽略了這樣一個事實,即我使用來自https://github.com/gtaylor/django-athumb的舊版S3BotoStorage作為我的默認存儲(即使我安裝了django-storage)。 當前版本的django-storages沒有遇到這個問題。 問題是內容類型頭文件在擊中boto時是unicode,而boto在將它發送到AWS之前使用urllib.quoteplus轉義unicode。 這不是Boto的錯,因為每個HTTP都必須以某種方式將頭轉換為非unicode字符串。 有關更深入的分析,請參閱https://github.com/boto/boto/issues/1669

原始問題

我正在使用django_storage的S3BotoStorage和FileField將文件上傳到Amazon S3。 這是我的領域:

downloadable_file = FileField(max_length=255, upload_to="widgets/filedownloads", verbose_name="file") 

在設置中:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 

在上傳/下載過程中一切正常。

但是 ,文件存儲在我的存儲桶中,內容類型不正確。 當我查看AWS S3控制台中文件的元數據時,文件的Content-Type顯示為“application%2Fpdf”而不是“application / pdf”。

轉義內容類型

如果你說它無關緊要,那就重要了。 谷歌Chrome的內置pdf閱讀器將掛在pdf上,內容類型無效,客戶端會引起我的注意。

這是通過django-storages / boto上傳的文件的示例。 如果您正在使用chrome的內置pdf閱讀器,我認為它會掛起,就像我和報告此內容的客戶一樣。 如果您使用的是非Chrome瀏覽器或adobe插件,或者將文件下載到磁盤,您可能會沒問題。

如果我通過AWS控制台手動將內容類型元數據更改為'application / pdf'(它提供的標准選項之一),那么就可以了。

我認為這是一個內部錯誤,boto構建AWS策略文檔以上傳文件的方式,因為我沒有做任何超出標准用法的事情。 但是,我已經介紹了boto代碼,無法找到它實際逃逸的位置。

有人可以建議一個解決方法,或者引導我查看boto中的違規代碼,以便我可以修補它並提交拉取請求嗎?

boto == 2.9.5 django-storages == 1.1.8

不是您的問題的直接答案,但可能是一個有用的解決方法。 我在使用S3的django-storage時遇到了問題。 我最后還是嘗試了可愛的兄弟 ,並對此感到非常滿意。 作者基於django-storages的S3模塊,並添加了許多修復程序。 我瀏覽了可愛的提交,並且有一些修改影響了內容類型標題,但是我無法在沒有設置新的django項目的情況下測試PDF上傳。 但是,我可以驗證通過Django上傳的所有文件在S3元數據的content-type字段中沒有損壞的斜杠。

如果由於某種原因你無法轉換為可愛的兄弟進行測試,請告訴我,我將嘗試設置一個簡單的Django項目來上傳一些PDF。

問題是我使用的是django存儲的分叉/過時版本,它在將內容類型頭文件發送到boto之前沒有正確地將內容類型頭文件轉換為字符串,后者通過使用將unicode字符串轉換為ascii字符串(根據HTTP頭文件的要求) urllib的quoteplus轉義機制。 通過切換到當前版本的django-storage來解決該問題。

有關該問題的更詳細分析,請參閱: https//github.com/boto/boto/issues/1669#issuecomment-27132112

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM