哪位大神给看看,做一个下载文件的功能,但是每次点击下载后前端没有反应,本应该是弹出一个下载文件的对话框。现在只能在浏览器控制台看到后端响应回来的数据,如下图:
前端用的Easy UI,后台是SpringMVC。
jsp页面处理下载的代码:
function down() {
var rows = $('#text_datagrid').datagrid('getChecked');
var ids = [];
var safe;
if (rows.length > 0) {
$.messager.confirm('确认', '您是否要下载当前选中的文件?', function(r) {
if (r) {
for ( var i = 0; i < rows.length; i++) {
ids.push(rows[i].id);
}
$.ajax({
url : '${pageContext.request.contextPath}/file/down',
data : {
ids : ids.join(','),
safe: "n"
},
dataType : 'json',
success : function(data) {
$('#text_datagrid').datagrid('load');
$('#text_datagrid').datagrid('unselectAll');
$.messager.show({
title : '提示',
msg : data.msg
});
}
});
}
});
} else {
$.messager.show({
title : '提示',
msg : '请勾选要下载的文件!'
});
}
}
后端方法:
//下载文件
@RequestMapping(value="/down",produces = "text/html;charset=UTF-8")
public Spring downFile(int ids,String safe,HttpServletRequest req,HttpServletResponse response) throws UnsupportedEncodingException{
SysData d= new SysData();
//得到要下载的文件名
File files = fileService.downFile(ids,safe);
String fileName=files.getFileName();
System.out.println(fileName);
//获取目标文件的绝对路径
String fileSaveRootPath = req.getSession().getServletContext().getRealPath("/uploadFiles/");
System.out.println(fileSaveRootPath);
//得到要下载的文件
java.io.File file = new java.io.File(fileSaveRootPath,fileName);
if (!file.exists()) {
d.setSuccess(false);
d.setMsg("您要下载的资源已被删除!");
}else{
response.setContentType("text/html;charset=utf-8");
//设置Content-Disposition控制浏览器下载该文件
response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
//设置ContentType
response.setContentType("multipart/form-data");
response.setContentLength((int)file.length());
FileInputStream in=null;
OutputStream out=null;
try {
//读取要下载的文件,保存到文件输入流
in = new FileInputStream(fileSaveRootPath+"/"+ fileName);
// 创建输出流
out = response.getOutputStream();
// 创建缓冲区
byte buffer[] = new byte[1024];
int len = 0;
// 循环将输入流中的内容读取到缓冲区当中
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len); // 输出缓冲区的内容到浏览器,实现文件下载
}
d.setSuccess(true);
d.setMsg("下载文件成功!");
} catch (IOException e) {
e.printStackTrace();
d.setSuccess(false);
d.setMsg("下载文件失败!");
}finally{
if (in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
String json = JSON.toJSONStringWithDateFormat(d, "yyyy-MM-dd HH����ss");
return json;
}
直接超链接指向文件最简单
######嗯,谢谢######不要 ajax 要下载的文件,如果想在下载的资源文件上家服务端判断,那么要分成两个请求。
你可以用 head 和 get 来区分 不同的请求。
此外你的 server 代码也是错误的, 下载数据回流就是下载数据流。 不要把 json 状态什么的混到里面,让浏览器自己去处理下载操作。
想你这样的代码服务端还要试图判断 下载是否成功。本身就是错误的,服务端无法预估网络状况。下载是否成功,要在客户端判断。 因为网络丢包、延迟等等问题。 server 无法察觉。 这是因为你下载是下行流量,除非你自己写 socket 做 数据包确认。
######嗯,谢谢,我先改改看看。######一个Spring MVC被你活生生用成了Servlet######ajax用的是get请求,下载是post.所以在前台构建一个form的表单用post请求一下。版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。