是否有任何可行的方式將上傳動態生成的文件直接上傳到amazon s3而無需先創建本地文件然後上傳到s3服務器?我使用python。謝謝如何將文件上傳到S3而不創建臨時本地文件
回答
我假設你使用的是boto
。 boto
的Bucket.set_contents_from_file()
將接受一個StringIO
對象,並且您寫入的用於將數據寫入文件的任何代碼都應該可以很容易地適用於寫入StringIO
對象。或者如果你生成一個字符串,你可以使用set_contents_from_string()
。
我試過在python file = request.file ['name'] set_contents_from_file (file.readlines()),但它需要一個字符串,所以我迭代並獲得字符串,但它給了我** AttributeError:'str'對象沒有屬性'tell'** – Shashank
這是因爲你傳遞一個字符串,而不是一個'StringIO'對象,因爲我建議... – kindall
哦,是的,你是正確的,但在兩種方式StringIO(文件)或StringIO(file.readlines()),文件上傳到S3,但無法打開只顯示空白符號瀏覽器.... – Shashank
對於使用的例子set_contents_from_string,看到博託文檔Storing Data部分,粘貼在這裏的完整性:
>>> from boto.s3.key import Key
>>> k = Key(bucket)
>>> k.key = 'foobar'
>>> k.set_contents_from_string('This is a test of S3')
但是如何在** set_contents_from_file **中可能,並且它接受文件本地存儲在磁盤上 – Shashank
@shihon我不明白你的意思題。 – jterrace
看到我用** file = request.file ['name'] **得到了一個文件,然後我將它保存在本地** os.save(os.path.join(path,file))**,from那裏我設置S3鍵和** set_contents_from_filename(os.path.join(路徑,文件))**,那麼我需要直接在S3上保存文件,而不是先保存在本地,然後在S3上... – Shashank
你可以使用BytesIO從Python標準庫。
from io import BytesIO
bytesIO = BytesIO()
bytesIO.write('whee')
bytesIO.seek(0)
s3_file.set_contents_from_file(bytesIO)
下面是一個例子下載的圖像(使用請求庫),並上傳到S3,而無需編寫本地文件:下面
import boto
from boto.s3.key import Key
import requests
#setup the bucket
c = boto.connect_s3(your_s3_key, your_s3_key_secret)
b = c.get_bucket(bucket, validate=False)
#download the file
url = "http://en.wikipedia.org/static/images/project-logos/enwiki.png"
r = requests.get(url)
if r.status_code == 200:
#upload the file
k = Key(b)
k.key = "image1.png"
k.content_type = r.headers['content-type']
k.set_contents_from_string(r.content)
這就是我一直在尋找的,謝謝 – noahandthewhale
def upload_to_s3(url, **kwargs):
'''
:param url: url of image which have to upload or resize to upload
:return: url of image stored on aws s3 bucket
'''
r = requests.get(url)
if r.status_code == 200:
# credentials stored in settings AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
conn = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, host=AWS_HOST)
# Connect to bucket and create key
b = conn.get_bucket(AWS_Bucket_Name)
k = b.new_key("{folder_name}/{filename}".format(**kwargs))
k.set_contents_from_string(r.content, replace=True,
headers={'Content-Type': 'application/%s' % (FILE_FORMAT)},
policy='authenticated-read',
reduced_redundancy=True)
# TODO Change AWS_EXPIRY
return k.generate_url(expires_in=AWS_EXPIRY, force_http=True)
- 1. 如何使用AWS Lambda創建臨時文件將'文件'上傳到S3?
- 2. PHP file_get_contents - 創建臨時本地文件?
- 3. Laravel文件上傳創建臨時文件的文件夾
- 4. 將csv文件上傳到ftp,而無需在本地創建物理文件
- 5. 將文件上傳到S3
- 6. 如何將文件上傳到Amazon S3?
- 7. 如何上傳文件而不將其轉爲臨時文件? (NetBeans JSF Primefaces)
- 8. 如何將文件上傳到Web服務器而不創建文件?
- 9. 創建使用iText的PDF文件,而不將其保存到臨時文件
- 10. 將int數組從ec2 servlet發送到s3而不創建本地文件
- 11. 從上傳文件創建Base64而不保存在本地php
- 12. 如何使用S3臨時證書上傳文件中的Javascript
- 13. 如何刪除CarrierWave上傳到S3的本地文件
- 14. 如何創建和上傳文件到亞馬遜S3
- 15. 如何將文件夾與子文件夾上傳到amazon s3?
- 16. 我如何上傳文件到Amazon S3,而不列出桶
- 17. Python的 - 如何今天的文件夾中創建的文件上傳到S3
- 18. 將大文件上傳到S3而不通過服務器
- 19. Java創建臨時文件
- 20. Python將臨時文件寫入S3
- 21. 上傳文件到Amazon S3
- 22. 如何將上傳文件從臨時目錄移動到永久目錄中新創建的文件夾
- 23. 使用Faraday將文件上傳到S3
- 24. 將大文件上傳到Amazon S3
- 25. 使用POST將文件上傳到s3
- 26. Cordova將文件上傳到S3
- 27. 將文件上傳到Amazon S3
- 28. 用Delphi將文件上傳到Amazon S3
- 29. Boto:將多個文件上傳到s3
- 30. 將Android文件上傳到Amazon S3
的答案解釋兩種方法可以做到這一點。但是如果你遇到一個只能獲取文件的API,你可能想看看'tempfile.TemporaryFile';使用正確的參數,您將獲得類似文件的對象,儘可能接近不成爲真實文件。 (在POSIX上,這意味着它沒有目錄項,並且除非必要,它不會被備份到磁盤;在Windows上,它實際上是一個臨時目錄周圍存在的文件對象的包裝對象,直到您關閉它爲止,這並不總是好的足夠了,所以你可能需要PyWin32'CreateFile'並且做一些更復雜的代碼來獲得你想要的)。 – abarnert
目前boto沒有這方面的功能。 'Key.open_write()'方法尚未實現。一旦它是你將有答案。 ''set_contents_from_stream()'據稱可以從流對象讀取,但它實際上期望一個文件...我不知道它是否可以以某種方式使用... – DejanLekic