使用springmvc中ResponseEntity下载文件

今天遇见了一个点击table列表中文件名,实现下载文件的功能。
因为这边的项目用的springmvc做的容器,以下是通过ajax访问该url通过输入流将数据(该数据通过url携带)中携带的文件内容(content)转换成字节存入缓存中。
通过springmvc封装的下载实现ResponseEntity将字符串输出成.docx文件下载。

第一种方法:

     ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body, headers, statusCode);

通过设置请求体(body),请求头(headers),请求状态(statusCode)传回前端页面。

    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;

    @RequestMapping("/download/{content}/{title}")
    public ResponseEntity<byte[]> download(HttpServletRequest        request,@PathVariable String content ,@PathVariable String title ) throws IOException {
        //设置缓存
        byte[] body = null;
        //字节流读取String数据
        ByteArrayInputStream is = new ByteArrayInputStream("content".getBytes());
        body = new byte[is.available()];
        is.read(body);
        //设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", "attchement;filename=" + title+".docx");
        //设置请求状态
        HttpStatus statusCode = HttpStatus.OK;
        ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body, headers, statusCode);
        return entity;
    }

页面不能通过ajax访问url。
必须通过页面window.location.href = resqURL;属性来访问。

设置文件名时,有url中文乱码问题,解决方法。

//设定URLEncoder编码集为utf-8。具体原理可以百度。
String fileName =URLEncoder.encode(title+".doc", "utf-8");
//或者使用ResponseEntity中HttpHeaders headers对象的.add()方法设定报文头
//headers.add("Content-Disposition", "attchement;filename=" + fileName);

上面一种方法因为使用了return,可以会出现在特定的浏览器中自行打开文件,而不是下载,如ie浏览器对word、excel等文件的处理。

第二种方法:

使用servlet的输出流 ServletOutputStream

具体实现和上面相似:


@RequestMapping("/download/{infoId}/{fundCode}")
//这里创建了HttpServletResponse的实例对象。
    public void download(@PathVariable String infoId,@PathVariable String fundCode,HttpServletResponse response) throws IOException {
        //和上面一样,将content数据使用流放入缓存body中
        byte[] body = null;
        ByteArrayInputStream is = new ByteArrayInputStream(content.getBytes());
        body = new byte[is.available()];
        is.read(body);
        //将ContentType、Header等需要的设置放进 HttpServletResponse传回前端
        String fileName =URLEncoder.encode(title+".doc", "utf-8");

        response.setContentType("application/msword");
        response.addHeader("Content-Disposition", "attachment;filename=" +fileName);
        response.setContentLength(body.length);  
        //获取Servlet的输出流ServletOutputStream 
        ServletOutputStream sos = response.getOutputStream();  
        sos.write(body);  
        if (sos != null) {  
            sos.close();  
        }
    }

你可能感兴趣的:(业务)