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

时间:2017-03-15 22:11:36

标签: python django amazon-s3 upload boto3

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

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

1 个答案:

答案 0 :(得分:0)

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

S3: Working with Folders