django - Django:按钮单击时的二进制文件下载返回不正确的数据
问题描述
使用 Ajax 和 Django 为二进制文件单击按钮实现文件下载,如下所示
Django 代码
def generate(self,parms):
#pdb.set_trace()
json_data = json.loads(parms.body.decode('utf-8'))
d_fldr = BASE_DIR+'/tmp/'+json_data['sessn']+'/'
resp = None
try:
data = None
with open(d_fldr + json_data['fn'],'rb') as f:
data = f.read()
resp = HttpResponse(data,'application/octet-stream')
resp['Content-Disposition'] = 'attachment;filename=%s'%(json_data['fn'])
except:
resp = None
return resp
按钮单击时的 AJAX 调用
function ajax_file_send(req,onSucc,onFail) {
req['beforeSend'] = function() {
$('#loading').modal({backdrop: "static"});
}
req['complete'] = function(){
$('#loading').modal('hide')
}
req['error'] = onFail;
req['success'] = onSucc;
$.ajax( req );
}
....
.....
$('#btn_gen').on('click',function(e) {
console.log("Generate clicked");
json = { 'sessn' : global_sessn,
'fn' : $('#kdb_sel').val(),
'xml' : $('#kdb_xml').val()
};
var req = {
url: "ajx_generate",
method: "post",
processData: false,
contentType: false,
headers: { "X-CSRFToken": '{{ csrf_token }}'
},
data: JSON.stringify(json),
//responseType: 'arraybuffer',
};
ajax_file_send(req,fun_succ1,fun_fail1);
function fun_succ1(response) { // on success..
console.log("fun_succ1 success");
var binaryData = []; binaryData.push(response);
var a = document.createElement('a');
var url = (window.URL || window.webkitURL).createObjectURL(new Blob(binaryData, {type: "application/kdb"}));
a.href = url;
a.download = $('#kdb_sel').val();
document.body.append(a);
a.click();
a.remove();
window.URL.revokeObjectURL(url);
}
问题
单击按钮时下载的文件 (2KB) 比服务器上最初的文件 (1.4Kb) 更大,而在 DEV Tools 中的网络选项卡Header : Content-Length
上正确设置为 1.4Kb
解决方案
推荐阅读
- linq - EF linq 查询在 linqpad 中工作,但不在应用程序中
- python - PyObjc/AppKit - 启动 Mac 应用程序而不窃取焦点
- javascript - 我想从 ajax 中的 sql 数据中获取数据但不工作
- c# - LoggedinDTO 是否应该包含用户密码
- java - AAR 库的 Application()
- java - 如何删除某个不是索引的某个位置的某个字符?
- django - Your Platform Name Here 服务器出现 500 错误 - Django/Openedx
- html - 带有滚动文本和重叠 div 的句子
- karate - 如何发送只有一个 json 字段的多部分请求?
- c - 如何在 C 中动态定义结构元素