2013-11-22 74 views
2

我希望用戶能夠從我的django網絡應用下載文件。我寫了下面的代碼,但是當我下載一個文件時,這個文件會變成一個錯誤文件。它不會打開,文件的總大小將爲0字節。在Django/Nginx中無法正確下載文件

型號:

class Emov(models.Model): 
    User=models.ForeignKey(User) 
    mov_file=models.FileField(upload_to='miiv') 
    mov_name=models.CharField(max_length=50) 
    email=models.EmailField() #email of the uploader 
    download_count=models.PositiveIntegerField(default=0) 
    #other fields follows 

    @property 
    def pretty_name(self): 
     return "{0}.{1}".format(slugify(self.title), 
          os.path.splitext(self.mov_name.name)[1]) 

瀏覽:

def document_view(request,emov_id): 
    fileload=Emov.objects.get(id=emov_id) 
    response=HttpResponse() 
    response["Content-Disposition"]= "attachment; filename={0}".format(fileload.pretty_name) 
    response['X-Accel-Redirect']="/protected/{0}".format(fileload.mov_name.name) 
    return response 

Nginx的

location /protected/ { 
     internal; 
     root /C:/Python27/Scripts/env/Scripts/digi/media/miiv/; 

} 

我缺少什麼?

回答

2

嘗試做這樣的:

fileload = Emov.objects.get(id=emov_id) 
filename = fileload.mov_file.name.split('/')[-1] 
response = HttpResponse(fileload.mov_file, content_type='text/plain') # your content type 
response['Content-Disposition'] = 'attachment; filename=%s' % filename 

return response 

參見: https://docs.djangoproject.com/en/dev/ref/request-response/#telling-the-browser-to-treat-the-response-as-a-file-attachment

希望它能幫助。

編輯
FileField.url屬性,你應該能夠路徑傳遞給您的文件(如/protected/)。 https://docs.djangoproject.com/en/dev/ref/models/fields/#filefield-and-fieldfile

+0

感謝您的回覆,如果附件是一個應用程序或其他格式。 Will'response = HttpResponse(fileload.mov_file,content_type ='text/plain')'工作嗎? – picomon

+0

我認爲有時它可能會使用適當的智能。檢查:http://webdesign.about.com/od/multimedia/a/mime-types-by-content-type.htm – McAbra

+0

做出更改後,我能夠下載該文件,這是一個zip文件(468kb )大小,我試圖下載一個PDF文件(1.80MB)我的瀏覽器崩潰,我的電腦掛起。這可能是由於內容類型?如何確定文件的實際內容類型,因爲我不知道用戶將要上傳的文件類型。 – picomon