【问题标题】:Python requests.put() corrupts the uploaded image filePython requests.put() 损坏了上传的图片文件
【发布时间】:2018-10-04 01:59:10
【问题描述】:

我正在尝试使用 Python 请求包将图像文件上传到我的 Amazon AWS S3 存储桶。

我的代码打开存储桶,下载图像文件,调整图像大小,将图像保存在本地,然后尝试将保存的图像上传到 S3 存储桶。

一切正常,只是上传的 jpg 文件在某种程度上已损坏,以至于无法再将其视为图像。我检查了正在上传的原始文件没有损坏。

我的代码是:

conn = S3Connection(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
bucket = conn.get_bucket(settings.AWS_STORAGE_BUCKET_NAME)

for key in bucket.list(prefix='media/userphotos'):
    file_name=key.name
    full_path_filename = 'https://' + settings.AWS_STORAGE_BUCKET_NAME + '.s3.amazonaws.com/' + file_name
    fd_img = urlopen(full_path_filename);
    img = Image.open(fd_img)
    img = resizeimage.resize_width(img, 800)
    new_filename = full_path_filename.replace('userphotos', 'webversion')
    # Save temporarily before uploading to S3 bucket
    img.save('temp.jpg', img.format)
    the_file = {'media': open('temp.jpg', 'rb')}
    r = requests.put(new_filename, files=the_file, auth=S3Auth(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY))
    fd_img.close()

更新

我刚刚注意到,虽然无法使用 Web 浏览器或 Mac 上的 Preview 打开 jpg 文件,但可以使用 Adob​​e Photoshop 成功打开它!很明显,图像在文件中,但requests.put() 创建的 jpg 文件有一些内容,该文件正在对文件执行某些操作,阻止它被 Web 浏览器读取。奇怪!

【问题讨论】:

  • 本地文件temp.jpg可以在浏览器中显示吗?如果你 get() 只是 put() 的文件,它会返回不同吗?
  • 是的,本地 temp.jpg 可以在网络浏览器中显示。
  • 您找到解决方案了吗?我有一个非常相似的问题,但我使用 requests.post 将图像文件上传到个人管理的 Apache Web 服务器而不是 AWS。
  • 嗨。这事有进一步更新吗?我也有这个问题。我的设置与 Brendan 的设置相同。 request.post 与托管 Apache 服务器。

标签: python amazon-web-services amazon-s3


【解决方案1】:

改为这样做:

requests.put(url, data=open(filename, 'rb'))

我注意到使用请求库中记录的“文件”会在文件中添加一堆垃圾。你用xxd <filename>检查它

【讨论】:

    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2017-09-13
    • 2014-10-08
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    相关资源
    最近更新 更多