为什么不能从django中正确地将jpeg保存到AWS S3

时间:2016-05-09 19:12:24

标签: 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'的文件。到媒体文件夹。

但是,如果我下载' test.jpg'从亚马逊尝试在图像查看器中打开它,我收到消息:"错误解释JPEG图像文件(不是JPEG文件:以0xf0 0xef开头)"。 jpg文件也只有26kb,而原始文件是116kb。

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

更新和解决方案

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

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

然而,如果你想先对图片做些什么,我也想出了一个解决方案(例如在Pillow中):

from Pillow import Image
import cStringIO as StringIO
import boto3

然后在视图函数中:

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())

1 个答案:

答案 0 :(得分:1)

看起来您的问题是您尝试多次读取套接字。您只能读取一次套接字,因此您需要继续参考重要信息。