python - 为什么 jpeg 不能从 django 正确保存到 AWS S3

标签 python django amazon-s3 jpeg boto3

我正在尝试将用户上传的文件直接保存到 S3,而不将其保存在本地。该项目使用 Django 1.9 和 Boto3。

相关代码为:

p=request.FILES['img'].read()
s3=boto3.resource('s3',
    aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
    aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY)
b = s3.Bucket(settings.AWS_STORAGE_BUCKET_NAME)
b.put_object(Key="media/test.jpg", Body=p)

这会正确地将名为“test.jpg”的文件上传到媒体文件夹。

但是,如果我从 Amazon 下载“test.jpg”并尝试在图像查看器中打开它,我会收到消息:“解释 JPEG 图像文件时出错(不是 JPEG 文件:以 0xf0 0xef 开头)”。 jpg 文件也只有 26kb,而原始文件为 116kb。

出了什么问题?我假设我在 put_object 方法中将错误的数据作为 Body 传递。但是 p 应该是什么?

更新和解决方案

在 JordonPhilips 的帮助下,我意识到,因为我之前已经在 View 中使用 Pillow 打开了上传的图像,所以 request.FILES['img'] 套接字已被读取。

我采用的解决方案是删除 Pillow 代码,将 boto 上传保留为 request.FILES['img'] 的首次访问。

但是,如果您想先对图像执行某些操作(例如在 Pillow 中),我也想出了一个解决方案:

from Pillow import Image
import cStringIO as StringIO
import boto3

然后在 View 函数中:

im = Image.open(request.FILES['img'])
# whatever image analysis here
file2 = StringIO.StringIO()
im.save(file2,"jpeg",quality='keep')
s3 = boto3.resource( 's3', aws_access_key_id=settings. AWS_ACCESS_KEY_ID, aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY)
b = s3.Bucket(settings.AWS_STORAGE_BUCKET_NAME)
b.put_object(Key="media/test.jpg", Body=file2.getvalue())

最佳答案

看来您的问题是您尝试多次读取套接字。您只能读取一次套接字,因此您需要保留重要信息的引用。

关于python - 为什么 jpeg 不能从 django 正确保存到 AWS S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37123648/

相关文章:

python - django.core.exceptions.ImproperlyConfigured : 'django_mongodb_engine' isn't an available database backend

python - 选择 Tensorflow 1 层中的特定功能

python - 通过 python urllib 和 urllib2 在本地主机上进行 HTTP 请求非常慢

python - 如何为 Django 模型实例创建非数据库自动属性

amazon-web-services - 使用 boto3 从 Amazon S3 存储桶前缀中获取 n 个最后修改的对象

python - 如何使 Python 中的浮点值显示为 .00 而不是 .0?

python - 音频不播放。 Django,DEBUG = False

python - 在 python 中运行单元测试\集成测试

amazon-web-services - 将文件通过 FTP 传输到 AWS S3

Python Boto3 更新/覆盖 S3 存储桶中的对象