如何使用Spring MVC的下载文件中的浏览器?(How to download file in

2019-10-20 04:13发布

我在服务器上和我想下载使用浏览器在我的机器上的文件。 但我没有收到来自浏览器的选择要下载的文件。

我的代码

JSP

<div id="jqgrid">
    <table id="grid"></table>
    <div id="pager"></div>
</div>

JS

jq("#grid").jqGrid({
    ....

    onCellSelect: function(rowid, index, contents, event) {
    ...
       var fileName = jQuery("#grid").jqGrid('getCell',rowid,'fileName');
       $scope.downloadFile(fileName);
    }
});


$scope.downloadFile = function(fileName) {
    $http({
        url: "logreport/downLoadFile", 
        method: "GET",
        params: {"fileName": fileName}
     });
};

调节器

@RequestMapping(value = "/downLoadFile", method = RequestMethod.GET)
public void downLoadFile(HttpServletRequest request, HttpServletResponse response) {
    try {
        String fileName = request.getParameter("fileName");
        File file = new File(filePath +"//"+fileName);
        InputStream in = new BufferedInputStream(new FileInputStream(file));

        response.setContentType("application/xlsx");
        response.setHeader("Content-Disposition", "attachment; filename="+fileName+".xlsx"); 


        ServletOutputStream out = response.getOutputStream();
        IOUtils.copy(in, out);
        response.flushBuffer();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我没有得到任何异常,但不知道为什么浏览器对话框不打开下载的文件。 还具体在哪里下载文件?

Answer 1:

@SotiriosDelimanolis是正确的。 文件下载是不可能的使用Ajax请求。 只需使用'window.location'

$scope.downloadFile = function(fileName) {
    window.location.href = 'logreport/downLoadFile?fileName=asdad1';
};


Answer 2:

我没有足够的信用给予评论所以这里wiritting ..谢谢user1298426。 我strugling像什么这一点。 我是用AJAX尝试。 随着window.location.href,我可以在浏览器下载文件...

我的JavaScript代码如下:

jQuery('#exportToZip').click(function(){

          window.location.href = '*****';
      });

*****:是URL映射,我在控制器。

@RequestMapping(value = "/****")
@ResponseBody
public void downloadRequesthandler(HttpServletRequest request,HttpServletResponse response) {
    String status;
    try {
        filedownloader.doGet(request, response); 

    } catch (ServletException e) {
        status="servlet Exception occured";
        e.printStackTrace();
    } catch (IOException e) {
        status="IO Exception occured";
        e.printStackTrace();
    }
    //return status;
}

公共无效的doGet(HttpServletRequest的请求,响应HttpServletResponse的)抛出的ServletException,IOException异常{ServletContext的上下文= request.getServletContext(); //构建文件的完整绝对路径

        File downloadFile = new File(filePath);
        System.out.println("downloadFile path: "+ filePath);
        FileInputStream inputStream = new FileInputStream(downloadFile);

     // get MIME type of the file
        String mimeType = context.getMimeType(fullPath);
        if (mimeType == null) {
            // set to binary type if MIME mapping not found
            mimeType = "application/octet-stream";
        }
        System.out.println("MIME type: " + mimeType);

        response.setContentLength((int) downloadFile.length());

        // set headers for the response
        String headerKey = "Content-Disposition";
        String headerValue = String.format("attachment; filename=\"%s\"",downloadFile.getName());
        response.setHeader(headerKey, headerValue);


        OutputStream outStream = response.getOutputStream();

        byte[] buffer = new byte[BUFFER_SIZE];
        System.out.println("buffer: "+ buffer.length);
        int bytesRead = -1;

        // write bytes read from the input stream into the output stream
      //be carefull in this step. "writebeyondcontentlength" and "response already committed"  error is very common here 
        while ((bytesRead = inputStream.read(buffer))!=-1  ) {

            outStream.write(buffer, 0, bytesRead);
        }

        inputStream.close();
        outStream.close();
        }

试图下载文件,AJAX是一种错误....

干杯......



Answer 3:

而不是使用的IOUtils复制方法

ServletOutputStream out = response.getOutputStream();
IOUtils.copy(in, out);

您可以使用下面:

 ServletOutputStream out = response.getOutputStream();

 byte[] bytes = IOUtils.toByteArray(in);
 out.write(bytes);



 out.close();
 out.flush();

希望这会工作。



文章来源: How to download file in browser using spring mvc?