我正在尝试使用HttpResponse下载CSV文件,以确保浏览器将其视为附件 . 我按照here提供的说明操作,但我的浏览器没有提示"Save As"对话框 . 我无法弄清楚我的功能有什么问题 . 所有帮助表示赞赏 .
dev savefile(request):
try:
myfile = request.GET['filename']
filepath = settings.MEDIA_ROOT + 'results/'
destpath = os.path.join(filepath, myfile)
response = HttpResponse(FileWrapper(file(destpath)), mimetype='text/csv' )
response['Content-Disposition'] = 'attachment; filename="%s"' %(myfile)
return response
except Exception, err:
errmsg = "%s"%(err)
return HttpResponse(errmsg)
快乐的一天!
5 回答
如果文件是 static (即不是专门为此请求生成的),则无论如何都不应该通过django提供它 . 您应该配置一些由Web服务器提供服务的路径(如/ static /),并保存所有django开销 .
如果文件是 dynamic ,则有2个选项:
在内存中创建它并从django中提供它 .
在磁盘上创建它,并向其返回一个HttpResponseRedirect,以便您的网络服务器处理下载本身(如果文件非常大,则应使用此选项) .
至于动态提供它,我一直在使用以下代码(这是ExcelResponse的简化版本)
要使用它,只需使用返回CSVResponse(...)传递列表列表,dicts列表(具有相同的键),QuerySet,ValuesQuerySet
您是否尝试指定内容类型?例如
编辑:
请注意,此代码成功触发了“另存为”对话框 . 注意我直接在mimetype参数中指定“application / x-download” . 您还可能需要重新检查代码,并确保文件路径正确,并且FileWrapper()没有做一些奇怪的事情 .
谢谢大家的建议 . 我选择了一些新的技巧:)但是我想我已经在这里找到了我的问题的答案:Downloading CSV via AJAX我的"savefile"函数是通过Ajax请求调用的,看来ajax有一个限制,无论HTTP头是什么都不会出现"save as dialog box"是 .
我应该提到我使用Ajax来调用这个函数,但我从未想过这可能是一个问题 . :)谢谢StackOverflow!
托马斯,我曾使用Ajax函数来保存和下载这个文件 . 看起来在这种情况下,无论 Headers 如何,都不会出现“另存为”框 . 我只是用javascript来下载该文件 . window.open( “路径/到/文件”);它成功了 . 我在IE6和Firefox上测试过,出现了对话框 .
如果不将文件名用双引号括起来会有什么不同吗?示例代码不引用文件名:
但是你的代码确实: