Django模板中下载文件的URL

6
我发现有很多类似的问题,但没有好的答案。我有一个仪表板,用户可以上传文件并显示它们。我想让他们能够点击图标或文件名并下载文件。现在它会在浏览器中打开文件,在图片和pdf的情况下不是问题,因为你可以从那里保存。但当你有docx、二进制或zip文件时,你需要一个下载链接,即使对于pdf和图片也是如此,这将非常方便。
以下是我的视图,请忽略被注释掉的部分:
@login_required(login_url='/dashboard-login/')
def dashboard(request):
    current_user = request.user
    current_client = request.user.client

    files = ClientUpload.objects.filter(client=current_client)    

    if request.method == 'POST':
        if request.FILES is None:
            return HttpResponseBadRequest('No Files Attached.')
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            #dz_files = request.FILES
            #for f in dz_files:
            #    new_file = ClientUpload(client=current_client, file_upload=f)
            #    new_file.save() 
            #    logger = logging.getLogger(__name__)
            #    logger.info("File uploaded from " + current_client.company)
            newfile = ClientUpload(client=current_client, file_upload=request.FILES.get('file_upload'))
            newfile.save()
            logger = logging.getLogger(__name__)
            logger.info("File uploaded from " + current_client.company)          
        else:   
            logger = logging.getLogger(__name__)
            logger.warning("Upload Failed")

        return HttpResponseRedirect(reverse('dashboard'))
    else:
        form = UploadFileForm()

    data = {'form': form, 'client': current_client, 'files': files}
    return render_to_response('dashboard.html', data, context_instance=RequestContext(request))

以下是模板,不用担心过滤器,它只是基本名称并充当文件名的os.path.basename。它与问题无关:

{% load i18n %}
{% load staticfiles %}
{% load sasite_filters %}

<table class="table">
<tr>
    <th>{% blocktrans %}Filename{% endblocktrans %}</th>
    <th>{% blocktrans %}Size (Bytes){% endblocktrans %}</th>
    <th>{% blocktrans %}Upload Time{% endblocktrans %}</th>
    <th>{% blocktrans %}Actions{% endblocktrans %}</th>
</tr>
{% for file in files %}
    {% with uploaded_file=file.file_upload %}  
 <tr>
    <th><a href="{{ MEDIA_URL }}{{ file.relative_path }}">{{ uploaded_file.name|basename }}</a></th>
    <th>{{ uploaded_file.size }}</th>
    <th>{{ file.created_at }}</th>
    <th><a href="{{ uploaded_file.url }}" id="view-btn"><i class="fa fa-search"></i></a><a href="{% url 'dashboard-delete' upload_id=file.id %}"><i class="fa fa-trash-o"></i></a></th>
    {% endwith %}
{% endfor %}
</tr>   
</table>

如您所见,我有两个图标,一个删除和一个查看图标。 我想制作一个下载图标,或者将文件名制作成一个下载链接。 但是,当我做类似这样的事情时<a href="{{ MEDIA_URL }}{{ file.relative_path }}">Download</a> 它只是在浏览器中打开。

relative_path只是模型上的一个属性,我也可以使用file_upload.path而不需要MEDIA_URL,但是这是同样的事情。

我还尝试在网址前面加上file:///,但什么也没发生,甚至没有在浏览器中打开。

我读到可以像这样做:

response = HttpResponse(mimetype='text/plain')
response['Content-Disposition'] = 'attachment; filename="%s.txt"' % p.filename
response.write(p.body)

来自Django提供下载文件

但是这是在视图中,我需要在模板中以某种方式完成此操作,或者找到一种方法在视图中完成此操作,但我不知道如何做到这一点。我考虑使用process_response的中间件,但我不知道如何在这种情况下编写它。

我需要获取通过视图行显示给该用户的所有文件:files = ClientUpload.objects.filter(client=current_client),并找到一种以下载方式而不是在浏览器中打开URL的方法来提供它们。

如果有人有这种情况的经验,或者知道我如何自定义模板、视图或添加其他内容来处理这个问题,那么提供一个小示例将会很有帮助。

我已经陷入了困境,似乎无法让它工作。任何建议都将不胜感激。

2个回答

14

你需要的是 <a href="{{ your_file_url}}" download> 吗?


我已经尝试过了,它只是在浏览器中打开文件,我想要强制下载。 - ss7
不,那应该会强制下载 http://www.w3schools.com/tags/att_a_download.asp -- 除非你正在使用Safari或IE。 - brandonchinn178
1
哦,我明白了,在标签中加入下载,让我试一下。 - ss7

4
<a href="{{ object.file_field.url }}" download>{{ object.file_field }}</a>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接