Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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 使用Django下载一个文件_Python_Django - Fatal编程技术网

Python 使用Django下载一个文件

Python 使用Django下载一个文件,python,django,Python,Django,这可能是一个简单的问题,但不知何故,我找不到解决办法。Django提供了很多关于上传文件的信息,但我如何下载文件呢 让我们假设我们在HTML上有一个按钮,它作为一个文件上传/something.txt 我试过使用django.views.static.service,但是这样做会在网页上打开一个文件 我的问题很简单:我们网站的用户下载文件的最佳方式是什么? 你需要读那个文件 使用HttpResponse和适当的内容类型提供服务 下面是一些示例代码: content = open("upload

这可能是一个简单的问题,但不知何故,我找不到解决办法。Django提供了很多关于上传文件的信息,但我如何下载文件呢

让我们假设我们在HTML上有一个按钮,它作为一个文件上传/something.txt

我试过使用
django.views.static.service
,但是这样做会在网页上打开一个文件

我的问题很简单:我们网站的用户下载文件的最佳方式是什么?

  • 你需要读那个文件
  • 使用
    HttpResponse
    和适当的内容类型提供服务
下面是一些示例代码:

content = open("uploads/something.txt").read()
return HttpResponse(content, content_type='text/plain')
这应该是一个文本文件

但正如您所描述的,在某些浏览器上,它不会要求下载文件,而是在浏览器中显示文件。如果要显示下载提示,请使用以下命令:

response = HttpResponse(open("uploads/something.txt", 'rb').read())
response['Content-Type'] = 'text/plain'
response['Content-Disposition'] = 'attachment; filename=DownloadedText.txt'
return response

但是,请注意,通过nginx或您选择的反向代理提供静态内容或上传文件可能是一个更好的主意。通过Django发送大文件可能不是最好的方法

可能有点晚,但我的解决方案是:

import os
from django.conf import settings
from django.http import HttpResponse, Http404

def download(request, path):
    file_path = os.path.join(settings.MEDIA_ROOT, path)
    if os.path.exists(file_path):
        with open(file_path, 'rb') as fh:
            response = HttpResponse(fh.read(), content_type="application/vnd.ms-excel")
            response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
            return response
    raise Http404
def render(self, value):
        return format_html('<a href="/media/{0}" download>{0}</a>', value)
def渲染(自身,值):
返回格式\u html(“”,值)