Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用boto3和Django(和S3)上传具有相同文件名的不同文件_Python_Django_Amazon S3_Upload_Boto3 - Fatal编程技术网

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

Python 使用boto3和Django(和S3)上传具有相同文件名的不同文件,python,django,amazon-s3,upload,boto3,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('s

我正在尝试创建一个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)
在my 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中,为该用户上载所有文件。例如,如果您的bucket是mybucket,而您的标识符是userId,那么您的上载url将是“+”user.Id+“/”+upload_file.name。S3没有目录结构,但使用名称前缀作为组织文件的一种方式。以下是相关文档的链接:


好的,您要么需要在文件名中添加哈希,要么将其放在唯一的目录中。