Django,如何下载Docx文件或任何文件

时间:2016-06-17 03:51:06

标签: html django download docx

我当前的网站根据当前用户的输入/信息创建Docx文件并将其保存到服务器。我将程序保存到服务器,以便用户以后可以访问它。所以我假设docx文件可以被认为是静态的?好吧无论如何,我无法让下载工作。

我已经看了很多关于如何让Docx下载的不同主题,到目前为止还没有一个对我有用。 1. Downloadable docx file in Django 2. Django create .odt or .docx documents to download Generate the MS word document in django

我得到的最接近的是下载的docx文件,但内容是路径,而不是我想要的实际docx文件。希望有人可以提供帮助,谢谢。

代码:

response = HttpResponse('docx_temps/extracted3/test.docx', content_type='application/vnd')
response['Content-Disposition'] = 'attachment; filename=test.doc'
return response 

链接代码,仍然无法使其工作。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Download</title>
</head>
<body>

<a href="users/Tyler/Desktop/Django_Formatically/mysite/Formatically/docx_temps/extracted3/test.docx"
  download="Test.docx"> 
   Test.docx
</a>

</body>
</html>

1 个答案:

答案 0 :(得分:0)

解决方案A - 静态文件

为了能够下载被视为 static 的文件,必须以某种方式提供它。在生产环境中,此任务可能由Apache或nginx等Web服务器处理。

要通过Django开发服务器为您的媒体提供服务,您可以将以下模式添加到urls.py

# urls.py
if settings.DEBUG:
    urlpatterns = patterns('',
    (r'^media/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
    (r'', include('django.contrib.staticfiles.urls')),
) + urlpatterns

因此,/media/以下的任何路径都将直接投放。您还必须确保在设置中正确设置MEDIA_ROOTMEDIA_URL

# settings.py
MEDIA_ROOT = 'Users/Tyler/Desktop/Django_Formatically/mysite/media/'
MEDIA_URL = '/media/'

然而 - 这种方法不允许您在Django级别上进行交互。所以你不能,例如检查Django中的用户权限或跟踪/日志请求。知道文件URL的每个用户都可以访问它。

解决方案B - 通过Django视图

    # views.py
    def file_view(request):

        filename = '<path to your file>'
        data = open(filename, "rb").read()
        response = HttpResponse(data, content_type='application/vnd')
        response['Content-Length'] = os.path.getsize(filename)

        return response

这只是最简单的方法,有一些缺点。整个文件内容是在python中加载的 - 因此在发送大文件和拥有大量请求时效率不高。可以在此处找到使用FileWrapper的解决方案:Serving large files ( with high loads ) in Django

或者您可以使用django-sendfile,以便轻松使用Apache mod_xsendfile或nginx XSendfile