SpringMVC实现文件下载

文件下载的时候要保证客户端弹出的保存框中的文件名不出现乱码,并且文件类型正确。

后台代码如下:

@RequestMapping(value = “/api/{sessionid}/documents/download/{documentid}”)
public void download(@PathVariable(“sessionid”)String sessionID,
@PathVariable(“documentid”)String docID,
HttpServletRequest request,
HttpServletResponse response) throws UnsupportedEncodingException{

    response.setCharacterEncoding("utf-8");
    request.setCharacterEncoding("utf-8");

    if ((docID == null || docID.length() == 0)) return;

    try{
        Document doc = docService.findByID(docID);

        if (doc == null) {
            return ;
        }

        String filepath = doc.getSavePath();
        String mimetype = doc.getMimeType();
        String fileName = doc.getFullName();

        if (filepath == null || filepath == "") return;

        String str = fileName + "." +StringUtils.getFilenameExtension(filepath);
        byte[] ss = str.getBytes("GBK");
        String filename = new String(ss,"ISO_8859_1");

        //得到客服端输出的输出流  
        OutputStream outputStream = response.getOutputStream();
        //输出文件用的字节数组,每次向输出流发送600个字节  
        byte b[] = new byte[1024];  
        //要下载的文件  
        File fileload = new File(filepath);
        //客服端使用保存文件的对话框  

        response.setHeader("Content-disposition", "attachment;filename=" + filename +"");// URLEncoder.encode(filename, "UTF-8"));

        response.setContentType(mimetype);
        //通知客服文件的长度  
        long fileLength = fileload.length();  
        String length = String.valueOf(fileLength);  
        response.setHeader("Content_length", length);  
        //读取文件,并发送给客服端下载  
        FileInputStream inputStream = new FileInputStream(fileload);
        int n = 0;
        while ((n = inputStream.read(b)) != -1) {

            outputStream.write(b, 0, n);
        } 

        outputStream.flush();
        outputStream.close();

        inputStream.close();
    } catch(RuntimeException e){

        logger.error(e.getMessage(), e.fillInStackTrace());

    } catch(Exception e){

        logger.error(e.getMessage() , e.fillInStackTrace());
    }

}

以上通过对文件名编码,使得前端保存文件的对话框显示的文件名是正常的。

byte[] ss = str.getBytes("GBK");
String filename = new String(ss,"ISO_8859_1");

response.setHeader("Content-disposition", "attachment;filename=" + filename +"");

这里的乱码显示主要是由于中文造成的,将中文件进行如上的转码即可。

对于文件类型,如果知道文件类型,就如下声明文件类型:

response.setContentType(mimetype);

如果不知道就设置成自动识别,不过不能保证对所有格式的文件都能正确识别:

response.setContentType("multipart/form-data");

对于前台就非常简单了,只要向以上的api发送一个get请求即可,最简单的就是使用超链接:

<a href='api/" + sessionId + "/documents/download/" + item.id+
                                "'>" + item.fullName +"</a>

保证href是文件下载的API,点击超链接的时候就会向这个api发送get请求,弹出保存文件的对话框(对于有些浏览器,比如Chrome就自动下载),实现文件下载。

本站总访问量