【问题标题】:Upload different files with identical filenames using boto3 and Django (and S3)使用 boto3 和 Django(和 S3)上传具有相同文件名的不同文件
【发布时间】:2017-08-06 21:27:59
【问题描述】:

我正在尝试创建一个 Django 服务器,将媒体文件存储在 S3 上,用户可以在其中上传自己的文件,这些文件可能都具有相同的文件名但文件不同。我已经设置了 S3 并通过像

这样的显式 python 命令让它工作
import boto3
s3 = boto3.resource('s3')
s3.Object('my-bucket','text.txt').put(Body=open('/text.txt', 'rb'))

我正在这样设置我的模型:

import boto3
s3 = boto3.resource('s3')
class MyModel(models.Model):
    my_file = models.FileField()
    file_url = models.CharField(max_length=200, blank=True, null=True)

在我的views.py中,我的上传表单是:

import boto3
s3 = boto3.resource('s3')

...

if form.is_valid():
    # creates object from form but doesn't go into database
    mymodel = form.save(commit=False)
    uploaded_file = request.FILES['my_file']
    s3.Object('my-bucket',uploaded_file.name).put(Body=request.FILES['uploaded_file'])
    mymodel.file_url = 'http://my-bucket.s3.amazonaws.com/' + uploaded_file.name;

我希望用户上传他们自己的文件,这些文件可能都具有相同的文件名但是不同的文件。我可以想象生成一个 md5 字符串,然后将其附加到文件名,但是当人们去下载他们的文件时,他们会在文件末尾附加一个随机哈希字符串。

我认为有更好、更优雅的方式来做到这一点。有人可以帮忙吗?

【问题讨论】:

  • 好吧,你要么需要给文件名添加一个哈希,要么把它放在一个唯一的目录中。

标签: python django amazon-s3 upload boto3


【解决方案1】:

如果可能,我将为用户设置一个唯一标识符,并为该用户上传所有文件,并将标识符附加到 url 作为文件夹。例如,如果您的存储桶是 mybucket,而您的标识符是 userId,那么您的上传 url 将是 'http://my-bucket.s3.amazonaws.com/' + user.Id + '/' + upload_file.name。 S3 没有目录结构,但使用名称前缀作为一种更容易组织文件的方式。以下是相关文档的链接:

S3: Working with Folders

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    相关资源
    最近更新 更多