Skip to main content
 首页 » 编程设计

python之在 Django/Nginx 中无法正确下载文件

2024年11月01日27jirigala

我希望用户能够从我的 Django 网络应用程序下载文件。我写了下面的代码,但是当我下载一个文件时,文件会变成一个错误文件。它不会打开,文件的总大小为 0 字节。

模型:

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/; 
 
} 

我错过了什么?

请您参考如下方法:

尝试这样做:

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