解决各个浏览器文件下载出现文件名中文乱码问题

    /**
     * 解决各个浏览器文件下载中文乱码问题
     * @param filename
     * @return
     */
    public static String getFileName(HttpServletRequest request, String filename) {
        String finalFileName = "";
        try {
            final String userAgent = request.getHeader("USER-AGENT");
            if (StringUtils.contains(userAgent, "Edge")) {
                finalFileName = URLEncoder.encode(filename, "UTF8");
            } else if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {
                // IE浏览器
                finalFileName = URLEncoder.encode(filename, "UTF8");
            } else if (StringUtils.contains(userAgent, "Mozilla")) {
                // google,火狐浏览器
                finalFileName = new String(filename.getBytes(), "ISO8859-1");
            } else {
                //其他浏览器
                finalFileName = URLEncoder.encode(filename, "UTF8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return finalFileName;
    }

在需要的地方调用此方法:

filename =getFileName( request,filename ); //调用这个方法,IE、火狐、谷歌都成功。

例如:

/*文档下载==================================================================*/
    @RequestMapping("/downLoad")    //返回 响应实体 字节数组,响应实体中返回字节流。ResponseEntity  //Object包括了String字符串和byte[]字节数组
    public ResponseEntity downLoad(int id,HttpServletRequest request) throws IOException {
        String path="D:/Junior Year.first/Intellij IDEA/hrm01/src/main/webapp/upload";  //设置路径,到这个文件夹下找文件
        Document targetDocument =documentService.findDocumentById( id );  //按id查找目标文档
        String filename=targetDocument.getFilename();   //获取下载的目标文档的名称
        File file = new File( path,filename );   //把 目标文件的 路径和文件名 作为字节流响应返回,现在把file文件作为字节流响应回去
        //如果下载的文件存在
        if(file.exists()){
            /* filename =new String( filename.getBytes("UTF-8"),"iso8859-1");  //设置编码格式,支持下载文件名有中文,但是IE浏览器不支持。*/
            /* filename =processFileName( request,filename ); //调用这个方法,失败的下载格式,失去文件名,被按照downLoad(1)、downLoad(2)、downLoad(3)......排序命名。*/
            filename =getFileName( request,filename ); //调用这个方法,IE、火狐、谷歌都成功。

            HttpHeaders headers =new HttpHeaders();  //消息的头,相当于响应消息的头文件怎么设置,比如说响应回去的文件的编码或者类型。。设置响应头的响应内容类型。  //第二个参数
            headers.setContentType( MediaType.APPLICATION_OCTET_STREAM);//流文件
            headers.setContentDispositionFormData( "attachment",filename );//作为附件响应
            //这里的ResponseEntity需要三个参数:泛型T,MultiValueMap,状态码HttpStatus。ResponseEntity,HttpStatus>
            return new ResponseEntity( FileUtils.readFileToByteArray( file ),headers, HttpStatus.OK);//byte[]字节数组
            //第一个参数,需要把file变成字节数组。是泛型的。FileUtils.readFileToByteArray( file )
        }else {
            String error ="下载的文档不存在!";
            //设置响应头的响应内容为html
            HttpHeaders headers =new HttpHeaders();
            MediaType mediaType = new MediaType( "text","html", Charset.forName( "utf-8" ) );
            headers.setContentType( mediaType );
            return  new ResponseEntity(error,headers,HttpStatus.OK); //String字符串
        }
    }


  /**
     * 解决各个浏览器文件下载中文乱码问题
     * @param filename
     * @return
     */
    public static String getFileName(HttpServletRequest request, String filename) {
        String finalFileName = "";
        try {
            final String userAgent = request.getHeader("USER-AGENT");
            if (StringUtils.contains(userAgent, "Edge")) {
                finalFileName = URLEncoder.encode(filename, "UTF8");
            } else if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {
                // IE浏览器
                finalFileName = URLEncoder.encode(filename, "UTF8");
            } else if (StringUtils.contains(userAgent, "Mozilla")) {
                // google,火狐浏览器
                finalFileName = new String(filename.getBytes(), "ISO8859-1");
            } else {
                //其他浏览器
                finalFileName = URLEncoder.encode(filename, "UTF8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return finalFileName;
    }

 
  

 

 

 

你可能感兴趣的:(文件上传,下载)