为什么 jpeg 不能从 django 正确保存到 AWS S3
Why won't jpeg save properly to AWS S3 from django
我正在尝试将用户上传的文件直接保存到 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' 并尝试在图像查看器中打开它,我会收到消息:"Error interpreting JPEG image file (Not a JPEG file: starts with 0xf0 0xef)"。 jpg 文件也只有 26kb,而原始文件是 116kb。
出了什么问题?我假设我在 put_object
方法中将错误的数据作为 Body
传递。但是 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())
您的问题似乎是您试图多次读取套接字。套接字只能读取一次,重要信息请参考。
我正在尝试将用户上传的文件直接保存到 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' 并尝试在图像查看器中打开它,我会收到消息:"Error interpreting JPEG image file (Not a JPEG file: starts with 0xf0 0xef)"。 jpg 文件也只有 26kb,而原始文件是 116kb。
出了什么问题?我假设我在 put_object
方法中将错误的数据作为 Body
传递。但是 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())
您的问题似乎是您试图多次读取套接字。套接字只能读取一次,重要信息请参考。