Django:移动浏览器不会触发下载,而是将文件加载到浏览器中

2024-09-28 19:26:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下看法。我通过笔记本电脑浏览器进行测试,下载过程中没有问题。但如果我在iphone上使用文档管理器(如“Documents”)的浏览器,请求的文件就会加载到浏览器中。我错过了什么

def servefiles(request, segmentID):
segments = []
obj = MainFile.objects.filter(owner=request.user)
file_name = MainFile.objects.get(file_id=segmentID).file_name
if request.method == 'GET':
    hosts = settings.HOSTS
    for i in hosts:
        try:
            url = 'http://' + i + ':8000/foo/' + str(segmentID)
            r = requests.get(url, timeout=1, stream=True)
            if r.status_code == 200:
                segments.append(r.content)
        except:
            continue
    instance = SeIDA('test', x=settings.M, y=settings.N)
    docfile = instance.decoder(segments)
    response = HttpResponse()
    response.write(docfile)
    response['Content-Disposition'] = 'attachment; filename={0}'.format(file_name)
    return response

注意:如果您可能想知道,SeIDA模块将数据编码到n个段上,这样m个段的存在就足以恢复文件。servefiles视图从存储后端检索段,恢复文件并最终为其提供服务。我在桌面浏览器上发出请求没有问题,但在iphone上没有下载管理器的情况下,我就可以下载文件了


Tags: 文件name管理器getobjectssettingsresponserequest
1条回答
网友
1楼 · 发布于 2024-09-28 19:26:56

多亏了Sayse,技巧在于在content_type头中指定mimetypes

import mymetypes

response = HttpResponse(content_type=mimetypes.guess_type(file_name))
response.write(docfile)
response['Content-Disposition'] = 'attachment; filename={0}'.format(file_name)
return response

相关问题 更多 >