当前位置: 首页 > 知识库问答 >
问题:

使用Django上传图片到亚马逊S3

罗兴运
2023-03-14

当用户上传图片时,我正在动态调整图像大小。原始图片存储在Amazon S3上一个名为djangobucket的bucket中。在这个桶中,包含数千个文件夹。

每个文件夹都以用户命名。我不必担心存储桶创建或文件夹创建,因为所有这些都是从客户端处理的。

下图为:

djangobucket  ------------> bob ---------> picture1.jpg
                                           picture2.jpg
                                           picture3.jpg
                                           picture4.jpg

如您所见,Bob有许多图片。一旦用户将图片上传到S3,我就会通过URL通过Django下载它,在这种情况下,它将是:http://s3.amazonaws.com/djangobucket/bob/picture1.jpg

我下载图像并执行图像处理并将处理后的图像保存在我的django应用程序服务器上。

我想将这个处理过的图像发送回bob的文件夹,这样就可以通过http://S3 . amazonaws . com/djangobacter/bob/picture 1 _ processed . jpg公开访问它

客户端已经可以访问amazon密钥和密钥,这样他或她就可以将图片上传到这个bucket。服务上的所有用户使用相同的密钥。我也将使用相同的钥匙。

我听说过Boto,但它涉及桶创建,我不确定如何只上传部分。我只关心将图片上传到适当的用户文件夹。

我已经研究了几个小时,所以我求助于这里的专家。

这是我的代码,这样你就可以更好地理解我在做什么。

user = 'bob'

url = 'http://s3.amazonaws.com/djangobucket/bob/picture1.jpg'
filename = url.split('/')[-1].split('.')[0]

download_photo = urllib.urlretrieve(url, "/home/ubuntu/Desktop/Resized_Images/%s.jpg" % (filename))
downloaded_photo = Image.open("/home/ubuntu/Desktop/Resized_Images/%s.jpg" % (filename))

resized_photo = downloaded_photo.resize((300, 300), Image.ANTIALIAS)
new_filename = filename + "_processed"

resized_photo.save("/home/ubuntu/Desktop/Resized_Images/%s.jpg" % (new_filename)) 

我想将保存在 /home/ubuntu/Desktop/Resized_Images/Bob的文件夹中的调整大小的照片发送到Amazon S3上的djangobucket中,并使其公开可见。

谢谢你的帮助。

编辑我找到了这个链接:http://www . Laurent luce . com/posts/upload-and-download-files-to from-Amazon-S3-using-pythondjango/

我不知道如何在我的案例中使用它,但我认为我在正确的轨道上。

共有1个答案

卢涵畅
2023-03-14

< code>boto是最好的方法

您可以使用以下方法获取现有存储桶:

get_bucket(bucket_name, validate=True, headers=None)

安装boto后,此代码应完成您需要执行的操作

from boto.s3.connection import S3Connection
from boto.s3.key import Key

conn = S3Connection('<aws access key>', '<aws secret key>')
bucket = conn.get_bucket('<bucket name>')
k = Key(bucket)
k.key = 'file_path_on_s3' # for example, 'images/bob/resized_image1.png'
k.set_contents_from_file(resized_photo)

这里有一些到Boto API和Boto S3文档的链接

 类似资料:
  • 我正在尝试使用 java 对亚马逊 S3 进行分段上传。我正在使用下面链接中的代码。 http://docs.aws.amazon.com/AmazonS3/latest/dev/llJavaUploadFile.html 方案 1:要上载的文件大小为 31627。我使用 partSize 作为 500000 来指定单个部件的大小。 由于文件的大小小于部分大小,因此文件将上传到 S3。 方案 2:

  • 问题内容: 我有一个800KB的JPG文件。我尝试上传到S3,并不断收到超时错误。你能弄清楚哪里出了问题吗?800KB很小,无法上传。 错误消息:在超时期限内未读取或写入到服务器的套接字连接。空闲连接将关闭。 HTTP状态码:400 AWS错误代码:RequestTimeout 问题答案: IOUtils.toByteArray是否有可能正在耗尽您的输入流,以便在进行服务调用时不再需要从中读取任何

  • 您好,我正在尝试将客户的图片直接上传到reactjs web app中的amazon s3。我在后端生成预签名的url,如下所示 生成的url看起来像这样。 https://s3.us-west-1.amazonaws.com/churchapp-la/5/ab49d601efed40e0a6de0509ab78c091.png?ContentType=image/png 在客户端我这样做 当我点

  • 嗨,当我尝试使用vue应用程序中预先指定的url将图像上传到我的amazon aws bucket时,我收到了400个错误请求。我已经成功生成了一个预先签名的url,但我无法使用它将图像发布到我的bucket。 获取预签名网址的路线 Vue client Vuex操作发布到预先指定的url Aws CORS许可 我得到“请求失败,状态代码400”错误。

  • 亚马逊云 图 1.20.2.1 - AWS AWS,即 Amazon Web Services,是亚马逊(Amazon)公司的 IaaS 和 PaaS 平台服务。AWS 提供了一整套基础设施和应用程序服务,使用户几乎能够在云中运行一切应用程序:从企业应用程序和大数据项目,到社交游戏和移动应用程序。AWS 面向用户提供包括弹性计算、存储、数据库、应用程序在内的一整套云计算服务,能够帮助企业降低 IT

  • 我能够从EC2实例连接到VPC中的ElastiCache Redis实例。但我想知道是否有办法连接到Amazon EC2实例之外的ElastiCache Redis节点,例如从我的本地开发设置或其他供应商提供的VPS实例。 当前在我的本地设置中尝试时: 我只在一段时间后才会暂停。