2017-03-15 79 views
2

我想創建一個在S3上存儲媒體文件的Django服務器,用戶可以上傳自己的文件,可能都具有相同的文件名,但是是不同的文件。我已成立了S3和得到它通過明確的Python命令工作像使用相同的文件名使用boto3和Django(和S3)上傳不同的文件

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

那麼,你要麼需要一個哈希添加到文件名,或者把它放在一個目錄中的獨特。 – user2896976

回答

0

如果可能,我將擁有該用戶的唯一標識符,然後將該用戶的所有文件上傳到url,並將其標識符上傳爲文件夾。例如,如果您的存儲桶是mybucket,並且您的標識符是userId,那麼您的上傳網址將爲'http://my-bucket.s3.amazonaws.com/'+ user.Id +'/'+ uploaded_file.name。 S3沒有目錄結構,但使用名稱前綴作爲組織文件的一種方式。下面是一個鏈接到相關文章:

S3: Working with Folders

相關問題