作者:许婉玟秀贤 | 来源:互联网 | 2023-08-12 10:09
我正在尝试使用Ajax发布请求从django服务器(Python 3.7)下载.gz
文件。这是最小的django视图功能和Ajax函数,用于在客户端上请求下载,压缩文件夹并将其发送(服务器)并在客户端上接收数据:
from pathlib import Path
def downloadfile(request):
folder = Path().home().joinpath('workspace')
tar_path = Path().home().joinpath('workspace.gz')
tar = tarfile.open(tar_path.as_posix(),'w:gz')
tar.add(folder.as_posix(),arcname='workspace')
tar.close()
try:
with open(tar_path.as_posix(),'rb') as f:
file_data = f.read()
respOnse= HttpResponse(file_data,content_type='application/gzip')
response['Content-Disposition'] = 'attachment; filename="workspace.gz"'
except IOError:
respOnse= HttpResponse('File not exist')
return response
这是客户端上的Ajax函数:
$(function () {
$('#downloadfile').submit(function () {
$.ajax({
type: 'POST',url: 'downloadfile',success: function(response){
download(response,'workspace.gz','application/gzip');
}
});
return false;
});
});
function download(content,filename,contentType)
{
var a = document.createElement('a');
var blob = new Blob([content],{'type':contentType});
a.href = window.URL.createObjectURL(blob);
a.download = filename;
a.click();
}
36.5 KB的示例gzip压缩文件夹在下载时会膨胀为66.1 KB,显然无法提取。
我所知道的:
- 该文件是健康文件,可以在服务器端提取。
- 数据已在客户端上传输和下载,但被夸大和破坏。
- Javascript函数中的
respone
变量看起来像二进制数据(没有任何标题)
我不知道的东西:
- 即使我以二进制形式读取和发送压缩文件并且两种内容类型都设置为
'application/gzip'
,为什么数据大小也会增加?
- 如果将某些内容添加到文件中,它是什么以及何时添加?
谢谢
花了几个小时后,以下对我有用。
诀窍是在Django视图部分使用hexify
。 Django视图中的发送部分应该是:
try:
with open(tar_path.as_posix(),'rb') as f:
file_data = binascii.hexlify(f.read())
respOnse= HttpResponse(str(file_data),content_type='application/gzip')
response['Content-Disposition'] = 'attachment; filename="%s"' % userid
os.remove(tar_path.as_posix())
except IOError:
respOnse= HttpResponse('File not exist')
return response
并且JS部分应该创建一个字节数组:
var r = response.substring(2,response.length - 1);
var typedArray = new Uint8Array(r.match(/[\da-f]{2}/gi).map(function (h) {
return parseInt(h,16)
}));
download(typedArray,'workspace.tar.gz','application/gzip');