首页 > 解决方案 > 文件下载不会完成(丢弃完成的文件,重新启动 - 影响较新的 Chrome(类似)浏览器)

问题描述

这直到最近才成为问题,它只影响类似 Chrome 的浏览器。例如,它确实会影响 Brave,但下载在 Firefox 上仍然运行良好。这个问题最近开始了。

我的服务器会创建一个报告文件(一个 csv),然后在准备好后通过链接将其提供给用户。报告文件是通过 django-celery 的异步任务创建的。如果文件未准备好,页面将重新加载并提供相同的下载链接。在实践中创建文件并不需要很长时间......

它不是特别复杂,但它适用于我的目的。

看法:

def account_get_all(request):
    link = None
    if request.method == 'GET':
        if request.GET.get('create-report'):
            # creates report
        elif request.GET.get('link'):
            link = request.GET.get('link')
            try:
                result = AsyncResult(link)
                if result.ready():
                    filename = "path/to/app/media/dumps/" + result.get()
                    wrapper = FileWrapper(open(filename))
                    response = FileResponse(wrapper, content_type='text/plain')
                    response['Content-Length'] = os.path.getsize(filename)
                    response['Content-Disposition'] = 'attachment; filename="'+result.get()+'"'
                    return response
                else:
                    parsed_uri = urlparse(request.META.get('HTTP_REFERER'))
                    domain = '{uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri)
                    return redirect(domain + path + result)
            except:
                # do some error handling
        return render(request, 'get_report.html', {'accounts' : accounts, 'file_link': link })
    else:
        return render(request, 'get_report.html', {'accounts' : accounts })

标签: pythondjangodjango-views

解决方案


所以我已经剖析了这个问题,删除了这条线response['Content-Length'] = os.path.getsize(filename),它起作用了......

我用谷歌搜索了这个,是的,有一些评论是关于某些浏览器(Chrome 等,obvs!)在文件的大小不完全符合广告宣传的情况下拒绝文件。在评论中,它说文件大小在大小请求和下载完成之间发生了变化。但这根本不是我的问题。我不知道为什么文件大小与我获得 Content-Length 时不同。

我可能会针对这个问题提出另一个问题。


推荐阅读