我正在Django开发一个Web应用程序,它的一个功能是添加带有照片的新文章。
我的Article
模型类包含models.FileField
。我使用S3BotoStorage
作为DEFAULT_FILE_STORAGE
(Amazon S3)。
用户可以通过两种方式将照片添加到文章中:
1)从磁盘上传照片(使用input type=file
)
2)将URL粘贴到现有照片
如果用户使用选项1),一切正常。我从request.FILES
字典中查看上传文件并将其分配到FileField
对象中的Article
。照片上传到S3。
但是当用户将URL粘贴到照片上时,我要做的第一件事就是下载这张照片。我是通过使用函数来实现的:
def downloadPhotoFromURL(url):
try:
img = urllib.urlretrieve(url)[0]
return img
except Exception:
return None
然后我将此图像保存到模型中的FileField
,因此我的整个代码负责下载图像并将其上传到S3,如下所示:
articleImg = downloadPhotoFromURL(url)
f = File(open(articleImg), 'rb')
newArticle.image.save('tmp', f)
在这种情况下,我无法将其上传到S3,2分钟后我收到BotoServerError: 400 Bad Request
。不幸的是,我没有任何其他信息,为什么这个请求是坏的。知道什么可能出错吗?当我将图像保存到模型时,我保存了一个模型,因此当我尝试将照片上传到S3时模型存在。