想要强制下载资源而不是直接在Web浏览器中呈现资源的Web应用程序Content-Disposition在表单的HTTP响应中发出标头:
Content-Disposition: attachment; filename=FILENAME
该filename参数可用于建议浏览器下载资源的文件的名称.但是,RFC 2183(Content-Disposition)在2.3节(文件名参数)中指出文件名只能使用US-ASCII字符:
当前[RFC 2045]语法将参数值(以及因此内容处理文件名)限制为US-ASCII.我们认识到允许在文件名中使用任意字符集的巨大愿望,但是定义必要的机制超出了本文档的范围.
然而,有经验证据表明,当今大多数流行的Web浏览器似乎都允许非US-ASCII字符(缺乏标准)对编码方案和文件名的字符集规范不同意.问题是,如果文件名"naïvefile"(没有引号,第三个字母是U + 00EF)需要编码到Content-Disposition标题中,那么流行浏览器采用的各种方案和编码是什么?
出于这个问题的目的,流行的浏览器是:
使用案例:用户点击网页上的链接 - 繁荣!加载位于其文件夹中的文件.
我尝试使用multipart/mixed消息打包文件,但它似乎只适用于Firefox
这就是我的回答:
HTTP/1.0 200 OK
Connection: close
Date: Wed, 24 Jun 2009 23:41:40 GMT
Content-Type: multipart/mixed;boundary=AMZ90RFX875LKMFasdf09DDFF3
Client-Date: Wed, 24 Jun 2009 23:41:40 GMT
Client-Peer: 127.0.0.1:3000
Client-Response-Num: 1
MIME-Version: 1.0
Status: 200
--AMZ90RFX875LKMFasdf09DDFF3
Content-type: image/jpeg
Content-transfer-encoding: binary
Content-disposition: attachment; filename="001.jpg"
<< here goes binary data >>--AMZ90RFX875LKMFasdf09DDFF3
Content-type: image/jpeg
Content-transfer-encoding: binary
Content-disposition: attachment; filename="002.jpg"
<< here goes binary data >>--AMZ90RFX875LKMFasdf09DDFF3
--AMZ90RFX875LKMFasdf09DDFF3--
Run Code Online (Sandbox Code Playgroud)
谢谢
PS否,压缩文件不是一个选项
可能重复:
在Django中提供动态生成的ZIP存档
(如果我错过了任何可能的副本,请随时指出我)
我看过这个片段:http: //djangosnippets.org/snippets/365/
这个答案:
但我想知道如何调整它们以满足我的需要:我希望压缩多个文件,并通过链接下载(或通过视图动态生成)存档.我是Python和Django的新手,所以我不知道如何去做.
预先感谢!
我正在使用以下代码,我传递.pdf文件名及其路径来创建zip文件.
for f in lstFileNames:
with zipfile.ZipFile('reportDir' + str(uuid.uuid4()) + '.zip', 'w') as myzip:
myzip.write(f)
Run Code Online (Sandbox Code Playgroud)
它只存档一个文件.我需要将列表中的所有文件归档到一个zip文件夹中.
在人们开始指出之前,是的,我已经从这个和这个链接咨询了答案,但那里给出的代码对我不起作用.代码运行但我无法在计算机的任何位置找到生成的zip文件.
一个简单明了的答案将不胜感激.谢谢.
我使用以下脚本来创建ZIP文件:
import zipfile
import os
def zip_file_generator(filenames, size):
# filenames = path to the files
zip_subdir = "SubDirName"
zip_filename = "SomeName.zip"
# Open BytesIO to grab in-memory ZIP contents
s = io.BytesIO()
# The zip compressor
zf = zipfile.ZipFile(s, "w")
for fpath in filenames:
# Calculate path for file in zip
fdir, fname = os.path.split(fpath)
zip_path = os.path.join(zip_subdir, fname)
# Add file, at correct path
zf.write(fpath, zip_path)
# Must close zip for all contents to be written
zf.close()
# Grab …Run Code Online (Sandbox Code Playgroud) 在我正在处理的Web应用程序中,用户可以创建一个包含文件的文件夹的zip存档.这是代码:
files = torrent[0].files
zipfile = z.ZipFile(zipname, 'w')
output = ""
for f in files:
zipfile.write(settings.PYRAT_TRANSMISSION_DOWNLOAD_DIR + "/" + f.name, f.name)
downloadurl = settings.PYRAT_DOWNLOAD_BASE_URL + "/" + settings.PYRAT_ARCHIVE_DIR + "/" + filename
output = "Download <a href=\"" + downloadurl + "\">" + torrent_name + "</a>"
return HttpResponse(output)
Run Code Online (Sandbox Code Playgroud)
但是,在下载zip存档时,这会产生长时间等待(10秒以上)的恶劣副作用.有可能跳过这个吗?而不是将存档保存到文件,是否可以直接发送给用户?
我确实相信torrentflux提供了我正在谈论的这个令人兴奋的功能.能够压缩GB数据并在一秒钟内下载.
我在django中作为附件发送请求时遇到问题.我的应用程序将一些数据写入文件并对其进行拉链.但是,当我返回附件响应时,浏览器会下载它,但zip文件已损坏.(原始zip包含我的文件,不会出现任何错误.)
我的代码在这里:
file_path = "/root/Programs/media/statics/schedules/"
zip_file_name = file_path + "test.zip"
zip_file = zipfile.ZipFile(zip_file_name, "w")
for i in range(len(planner_list)):
file_name = file_path + str(planner_list[i][0].start_date)
render_to_file('deneme.html',file_name ,{'schedule':schedule})
zip_file.write(file_name, os.path.basename(file_name),zipfile.ZIP_DEFLATED)
os.remove(file_name)
zip_file.close()
response = HttpResponse(file_path , content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=test.zip'
return response
Run Code Online (Sandbox Code Playgroud) python ×5
django ×4
browser ×2
zip ×2
archive ×1
file ×1
http ×1
http-headers ×1
multipart ×1
python-3.x ×1