开发者社区> 问答> 正文

java web文件下载功能:报错

哪位大神给看看,做一个下载文件的功能,但是每次点击下载后前端没有反应,本应该是弹出一个下载文件的对话框。现在只能在浏览器控制台看到后端响应回来的数据,如下图:

前端用的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;
      }

展开
收起
kun坤 2020-06-07 14:07:22 764 0
1 条回答
写回答
取消 提交回答
  • 直接超链接指向文件最简单

    ######嗯,谢谢######

    不要 ajax 要下载的文件,如果想在下载的资源文件上家服务端判断,那么要分成两个请求。

    你可以用 head 和 get 来区分 不同的请求。    

     

    此外你的 server 代码也是错误的,  下载数据回流就是下载数据流。 不要把 json 状态什么的混到里面,让浏览器自己去处理下载操作。

     

    想你这样的代码服务端还要试图判断 下载是否成功。本身就是错误的,服务端无法预估网络状况。下载是否成功,要在客户端判断。 因为网络丢包、延迟等等问题。  server 无法察觉。 这是因为你下载是下行流量,除非你自己写 socket 做 数据包确认。  

    ######嗯,谢谢,我先改改看看。######一个Spring MVC被你活生生用成了Servlet######ajax用的是get请求,下载是post.所以在前台构建一个form的表单用post请求一下。
    2020-06-07 14:07:28
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Web应用系统性能优化 立即下载
高性能Web架构之缓存体系 立即下载
PWA:移动Web的现在与未来 立即下载