gpt4 book ai didi

python - 使用 boto3 和 Django(和 S3)上传具有相同文件名的不同文件

转载 作者:行者123 更新时间:2023-11-28 18:23:55 25 4
gpt4 key购买 nike

我正在尝试创建一个 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 字符串,然后将其附加到文件名,但是当人们去下载他们的文件时,他们将在文件末尾附加一个随机哈希字符串。

我想有更好、更优雅的方法来做到这一点。谁能帮忙?

最佳答案

如果可能的话,我会为用户设置一个唯一标识符,并上传该用户的所有文件,并将标识符作为文件夹附加到 url。例如,如果您的存储桶是 mybucket,并且您的标识符是 userId,则您的上传 url 将是“http://my-bucket.s3.amazonaws.com/”。 ' + user.Id + '/' + uploaded_file.name。 S3 没有目录结构,但使用名称前缀来简化文件的组织。以下是相关文档的链接:

S3: Working with Folders

关于python - 使用 boto3 和 Django(和 S3)上传具有相同文件名的不同文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42821661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com