springmvc URL fastdfs服务器上下载文件 并改名为原始文件名

 亲测有效 公司项目中出现这个问题,发布一下,希望能帮到大家。

还对IE浏览器下载文件失败、出错进行了修复,保证中文文件名的正确显示,以及文件在IE下正确下载。

public InputStream getFileInputStream(String urlString) {
    InputStream is = null;
    try {
        // 构造URL
        URL url = new URL(urlString);
        // 打开连接
        URLConnection con = url.openConnection();
        // 输入流
        is = con.getInputStream();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return is;
}
@RequestMapping(value = "/download",method = RequestMethod.POST)
public ResponseEntity download(String url, String fileName) throws IOException {//前端页面传过来的
    log.info("url->" + url + ",fileName->" + fileName);
    HttpHeaders headers = new HttpHeaders();

    //处理IE
        String userAgent = request.getHeader("user-agent").toLowerCase();

        if (userAgent.contains("msie") || userAgent.contains("like gecko")  ||                 
            userAgent.contains("Trident")) {
            // win10 ie edge 浏览器 和其他系统的ie
            fileName = URLEncoder.encode(fileName, "UTF-8");
            //解决下载时,空格变加号
            fileName = StringUtils.replace(fileName, "+", "%20");
        } else {
            // fe
            fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");

            //解决下载时,空格变加号
            fileName = StringUtils.replace(fileName, "+", "%20");
        }

    //通知浏览器以attachment(下载方式)打开图片
    headers.setContentDispositionFormData("attachment",fileName); //解决原始文件名中有中文出现乱码);
    //application/octet-stream : 二进制流数据(最常见的文件下载)。
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    return new ResponseEntity(IOUtils.toByteArray(getFileInputStream(url)),
            headers, HttpStatus.CREATED);
}

你可能感兴趣的:(fastdfs,URL,下载)