【问题标题】:Django: redirect after file downloadDjango:文件下载后重定向
【发布时间】:2013-12-29 16:54:18
【问题描述】:

我正在我的Django 1.5 中处理一个允许我下载文件的视图。下载过程由HTML页面中的一个按钮触发,如下所示:

<a href="/file/download/{{ file.name }}/"><input type="button" value="Download!" /></a>

网址指向管理下载的视图:

def filedownload(request, filename):
    down_file = File.objects.get(name = filename)
    file_path = MEDIA_ROOT+str(down_file.file)
    file_name = down_file.filecomplete()
    if not Transaction.objects.filter(user = request.user, file = down_file):
        transaction = Transaction.objects.create(date = datetime.now(), user = request.user, file = down_file, vote = False)
        transaction.save()
    fp = open(file_path, 'rb')
    response = HttpResponse(fp.read())
    fp.close()
    type, encoding = mimetypes.guess_type(file_name)
    if type is None:
        type = 'application/octet-stream'
    response['Content-Type'] = type
    response['Content-Length'] = str(os.stat(file_path).st_size)
    if encoding is not None:
        response['Content-Encoding'] = encoding
    if u'WebKit' in request.META['HTTP_USER_AGENT']:
        filename_header = 'filename=%s' % file_name.encode('utf-8')
    elif u'MSIE' in request.META['HTTP_USER_AGENT']:
        filename_header = ''
    else:
        filename_header = 'filename*=UTF-8\'\'%s' % urllib.quote(file_name.encode('utf-8'))
    response['Content-Disposition'] = 'attachment; ' + filename_header
    return response

我想做的是在用户点击 downlad 按钮后立即将用户重定向到成功页面,但我找不到方法。

我不担心下载中断或其他不成功的下载,因为这是一个学校项目。

【问题讨论】:

    标签: django


    【解决方案1】:

    他是运行代码必须遵循的所有步骤:

    获取jQuery File Download,它允许使用 OnSuccess 和 OnFailure 回调进行下载。

    这是一个使用带有 Promise 的插件源的简单用例演示。演示页面还包括许多其他“更好的 UX”示例。

    $.fileDownload('some/file.pdf')
        .done(function () { //redirect });
    

    这是一个简单的用例演示,使用带有 Promise 的插件 sourcedemo page 还包括许多其他“更好的用户体验”示例。

    【讨论】:

      【解决方案2】:

      您可以将inputhref 设置为要显示的下载确认页面,传递文件名,然后在确认页面的模板中,将onload 事件设置为重定向到实际下载。

      &lt;body onload=window.location='/file/download/{{ file.name }}/'&gt;

      【讨论】:

      • 不起作用,由于某种原因没有触发下载。而且,无论如何,这是一种安全风险,我可以写任何文件的名称,即使没有权限也可以简单地下载它们!
      • 默认情况下,MEDIA_URL 上的内容可公开访问。如果您的下载内容很敏感,我建议您不要从 MEDIA_ROOT 提供它们。您可以直接从filedownload 中的文件系统加载它们,也可以在视图中添加@login_required 装饰器来控制用户访问。要传递文件名,您可以使用 input 提交来发布它,因此该名称不可见。
      【解决方案3】:

      您可以使用 ajax 请求等待下载完全成功。

      在你看来:

      $.fileDownload('some/file.pdf')
          .done(function () { //redirect
                              window.location = '/link'; 
                              })
          .fail(function () { alert('File download failed!'); });
      

      【讨论】:

      • 老实说,我不知道如何使用那段代码。我确定它是一个很好的解决方案,但我不知道如何使用它!
      【解决方案4】:

      如何使用之前的代码:

      首先在您的链接中添加名称、ID 或类别 下载链接

      下一步:这里我使用 id 来标识链接#a_d*

        <script type="text/javascript">
               $(document).on("click", "#a_d", function () {
                   $.fileDownload(.done(function () { //redirect
                                           window.location = '/link';})
                   });
               });
      </script>
      

      完成!!

      【讨论】:

      • &lt;script type="text/javascript"&gt; $(document).on("click", "#downloadbutton", function () { $.fileDownload(.done(function () { //redirect window.location = '/confirmation/download/{{ name }}';}) }); }); &lt;/script&gt;&lt;a href="/file/download/{{ file.name }}/"&gt;&lt;input type="button" value="Download!" id="downloadbutton" /&gt;&lt;/a&gt; 不起作用。
      猜你喜欢
      • 2019-09-28
      • 2013-12-19
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多