Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.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
Javascript 使用xmlhttprequest在django中使用按钮下载文件_Javascript_Python_Django_Download - Fatal编程技术网

Javascript 使用xmlhttprequest在django中使用按钮下载文件

Javascript 使用xmlhttprequest在django中使用按钮下载文件,javascript,python,django,download,Javascript,Python,Django,Download,我看了很多相同的问题,但没有一个解决我的问题, 我正在尝试使用按钮下载视图中生成的文件。 问题:单击下载按钮时,我得到一个空文件 我的看法是: class dumpView(View): template_name = 'download.html' def get(self, request): file = open("/home/test.pdf", "rwbt") response = HttpResponse(file.read(), content_type="ap

我看了很多相同的问题,但没有一个解决我的问题, 我正在尝试使用按钮下载视图中生成的文件。 问题:单击下载按钮时,我得到一个空文件

我的看法是:

class dumpView(View):

template_name = 'download.html'
def get(self, request):
    file = open("/home/test.pdf", "rwbt")
    response = HttpResponse(file.read(), content_type="application/pdf")
    response['Content-Disposition'] = 'attachement; filename=%s' % file
    return render(request, 'download.html')
我的网址:

url(r'^dump/', dumpView.as_view()),
我的模板:

 {% extends 'base.html' %} 
 {% load staticfiles %} 
 {% block content %}
 <div class="container">
 <div class="row">
    <div class="jumbotron">
        <div class="row">
            <center>
                <a href="javascript:void(0)" class="btn btn-primary btn-lg dump">Download</a>
            </center>
        </div>
    </div>
</div>
</div>
{% endblock %} 
{% block javascript %}
<script src="{% static 'js/home.js' %}"></script>
{% endblock %}

在您的视图中,您将
内容处置设置为
附件;filename=…
但要附加文件对象。我猜浏览器可能需要一个文件名,最好是有正确的扩展名

我在Django项目中有类似的视图,我也引用了文件名,但我不确定这是否必要


编辑:另外,“附件”中有一个输入错误,删除多余的“e”,看看这是否有帮助。在你看来,我建议在你的回复中增加一个大小

content = file(filename).read()
response = HttpResponse(content, content_type='text/plain')
response['Content-Length'] = os.path.getsize(filename)
response['Content-Disposition'] = 'attachment; filename=%s' % 'my_pdf.pdf'
正如@bob vork刚才所说的,
Content-Disposition
中的文件名不应该是python
file
对象,而是下载的文件名

在urls.py中注册视图,然后将javascript替换为:

<input type="button" value="Download" onclick="window.open('download_my_pdf')">
变成

<input type="button" value="Download" onclick="window.open('download_my_pdf')">
还要注意把正确的内容和类型放在一起。请注意,我没有测试视图(尤其是文件包装器),我将一些代码改编为纯文本。这也是如果将pdf视为文本文件,则会出现类型错误的原因

在URL.py中

urlpatterns = (
    [...]
    url('download_my_pdf', download_pdf),
)

您如何在视图中使用“response”var?我不会返回response以便使用我的模板。如果我只做“返回响应”,我可以直接下载文件,而不必使用我的模板。谢谢你的回答,但这并不能解决问题,我尝试了以下方法:“响应['Content-Disposition']='attachement;文件名=%s'%test.pdf”和“响应['Content-Disposition']='attachement;文件名=%s%/home/test.pdf”但我有一个空文件。另外:我认为我的js没有收到来自视图的响应,因为当我尝试返回响应时,我可以成功下载文件,而无需模板或按钮等待您的回答,我确实用您建议的内容替换了javascript,url为:“url(r'^dump/',dumpView.as_view(),name='download_my_pdf')”,按下按钮时无法下载文件。如果我使用content和getsize(),我会收到一个类型错误“强制使用Unicode:需要字符串或缓冲区,找到文件”
<input type="button" value="Download" onclick="window.open('download_my_pdf')">
from django.http import HttpResponse
from wsgiref.util import FileWrapper

@login_required
def download_pdf(request):
    filename = 'whatever_in_absolute_path__or_not.pdf'
    content = FileWrapper(filename)
    response = HttpResponse(content, content_type='application/pdf')
    response['Content-Length'] = os.path.getsize(filename)
    response['Content-Disposition'] = 'attachment; filename=%s' % 'whatever_name_will_appear_in_download.pdf'
    return response
urlpatterns = (
    [...]
    url('download_my_pdf', download_pdf),
)