我正在try 使指向Windows服务器上的文件路径的链接可供用户在单击文件链接后下载.

我的应用程序显示搜索票证模型结果的条目.页面上的结果包括以下项目:票证编号、描述、状态和指向平面文件的链接(存储在Windows服务器网络共享驱动器上;从\server.name\文件夹A\文件夹B\文件夹C\FILE到download.txt

注意事项

  • \server.name、\文件夹A和\文件夹B是常量
  • \文件夹C(以及要下载的文件是动态的(它们的位置和文件名将更改)
  • 用户将不会上传文件.所有可下载的文件-都已保存到Windows共享中.

在显示页面/templatehtml上,我可以在一个表中列出我的所有值(甚至是我想要下载的文件的链接).然而,当我将鼠标悬停在浏览器底部的链接上时,我看到了file://server.name/folder A/folder B\\folder C\\file to download.txt.是的,最后一个"斜杠"是正斜杠,而所有其他的"斜杠"都是反斜杠(不确定它们为什么要改变?)

当我将文件地址传递给模板时,它的格式是:\\server.name\\folder A\\folder B\\folder C\\file to download.txt(当我在页面上显示文件路径时,我可以在测试中看到这一点.

如何让希望下载文件的用户可以下载指向Windows服务器上文件路径的链接?

html

<body>

<h1><p>Ticket Number: {{ thisincident.IncidentID }}</p></h1>
<h3>Description: {{ thisincident.Description }}</h3>
<h4><p>Full Description</h4> {{ thisincident.FullDescription | linebreaks }}</p>

    
    
       Journal Entry #
       Date
       Person
       Journal Entry
       File Name
    
    
    
    {% for f in je %}
    
       {{ f.JE }}
       {{ f.Date }} 
       {{ f.resource }}
       {{ f.entry | linebreaks }}
       <a href="{{ f.Location }}">Download</a>
    
    {% endfor %}

View.py


def ticket_view(request, IncidentID):
    file_contents = []
    thisincident = ticket.objects.get(id=IncidentID)
    for root, dirs, files in os.walk(thisincident.LocationPath):
        for file in files:
            if not file == 'manifest.json':
                path_file = os.path.join(root, file)
                path_file = path_file.replace(thisincident.LocationPath + "\\", "")
                file_contents.append(path_file)
    log_list = parseJElog(thisincident.logfiletoparse)

    data = {
        "thisincident": thisincident,
        "result": file_contents,
        "je":log_list
    }
    return render(request, "tickethtml", data)

Urls.py

urlpatterns = [
    url(r'^homepage/$', views.home, name='home'),
    url(r'^tickets/$', views.tickets, name='tickets'),
    url(r'^ticket/(?P<IncidentID>\d+)$', views.ticket_view, name='ticket'),
]
if settings.DEBUG:
    urlpatterns+=static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Settings.py

MEDIA_BASE_ROOT = "\\server.name\\folder A\\folder B"
MEDIA_ROOT = os.path.join(MEDIA_BASE_ROOT, "\\folder B\\")
MEDIA_URL = ''

enter image description here

我对Django还很陌生,所以任何帮助都将不胜感激.

推荐答案

我以前也有过类似的问题.您可以按照以下步骤来解决这个问题.我将把逻辑分成两个函数,以使这一点简单明了.

1、展示车票

def ticket_view(request, IncidentID):
    thisincident = ticket.objects.get(id=IncidentID)
    log_list = parseJElog(thisincident.logfiletoparse)

    data = {
        "thisincident": thisincident,
        "je": log_list
    }
    return render(request, "ticket.html", data)

2.下载文件

import os
from django.http import FileResponse

def download_file(request, file_path):
    file_name = os.path.basename(file_path)
    file = open(file_path, 'rb')
    response = FileResponse(file)
    response['Content-Disposition'] = f'attachment; filename="{file_name}"'
    return response

我认为这就是你需要的代码,你的脸的问题可以简单地用os.pathpathlib来解决.在这里,我们将file path作为参数传递给函数,它以二进制模式打开文件,创建包含文件内容的FileResponse,并设置Content-Disposition标头以指定文件名供用户下载.

顺便说一句,Content-Disposition标头是可选的标头.

more about Content-Disposition

3.根据我们上面定义的函数更新您的URL.

4、更新模板.

{% for f in je %}
        {{ f.JE }}
        {{ f.Date }} 
        {{ f.resource }}
        {{ f.entry | linebreaks }}
        <a href="{% url 'download_file' file_path=f.Location %}">Download</a>
    {% endfor %}

5、更新您的设置

MEDIA_URL = '/media/' # edit this to your requirements 
MEDIA_ROOT = '\\server.name\folder A\folder B\folder C'  # Windows server path

# make sure that you also serving media files in the URL
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我希望这个解决方案能帮助你.

Html相关问答推荐

我如何 Select 外部html文件元素作为选项,并显示在一个div与jQuery?

如何在div中淡入和淡出渐变背景?

如何在所有屏幕大小下使带有背景图像的伪元素作为标题的衬底?

如何使用Reaction Js读取html文件中的代码

默认情况下使用Disbale Scroll,但在单击图标后将其激活

列表项文本在占据剩余空间之前在标记下换行

浮动Div在CSS中未按预期工作

页面文件夹内的 HTML 页面未加载主目录的 style.css

如何修剪 flex: 1 内的垂直文本?

四开:如何右对齐 PDF *和* HTML 中的文本

从触发元素移动到有间隙的内容时 CSS 工具提示关闭

并排放置两个 div,同时 div2 环绕 div1

如何影响 HTML 元素的哪些子元素导致其增长,哪些不增长?

如何配置 prettier 使其以 Vue.js 模板语法的特定方式运行?

Angular:从服务器下载 HTML 并打印

CSS 跨度与子元素交替 colored颜色

打开 Bootstrap 模式时无法获得模糊的背景

CSS 变量不适用于自定义属性回退值

在部分而不是正文中定义页面宽度

无法使用 Reactjs 多次更新本地存储