解決文件下載中文亂碼的問題(Chrome、Firefox、IE)

代碼有些不整潔,但是親測可用

 public void download (@RequestParam("filePath") final String filePath, 
                            @RequestParam("originalFileName") String originalFileName,
                            final HttpServletResponse response, final HttpServletRequest request) {
        logger.info("FTPController download begin. ftpPath=" + filePath + " ; originalFileName=" + originalFileName);
        boolean downloaded = false;
        final boolean exist = ftpAndSftpUtils.isFileExist(filePath);
        if (!exist) {
            throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCEPTION.setExceptionMsg("文件不存在"));
        }
        OutputStream outputStream = null;
        
        try {
            outputStream = response.getOutputStream();
            response.reset();
            
            String userAgent = request.getHeader("User-Agent");  
            if (userAgent.contains("Chrome") || userAgent.contains("Safari") || userAgent.contains("Firefox") ) {
            	logger.info("Google、Firefox 瀏覽器");
            	byte[] bytes = originalFileName.getBytes("UTF-8");
            	originalFileName = new String(bytes, "ISO-8859-1"); 
            	response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", originalFileName)); // 文件名外的雙引號處理firefox的空格截斷問題  
            } else {
            	logger.info("IE 瀏覽器");
            	response.setCharacterEncoding("UTF-8");
            	response.setContentType("application/octet-stream");
            	String fileName = URLEncoder.encode(originalFileName, "UTF-8");
            	response.setHeader("Content-disposition", "attachment; filename=" + fileName); // 文件名外的雙引號處理firefox的空格截斷問題
            }
            
            downloaded = ftpAndSftpUtils.downloadFile(filePath, outputStream);
            outputStream.flush();
        } catch (UnsupportedEncodingException e) {
            logger.error("不支持的編碼格式", e);
        } catch (IOException e) {
            logger.error("文件下載失敗", e);
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    logger.error("輸出流關閉失敗", e);
                }
            }
        }
        if (!downloaded) {
            throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCEPTION.setExceptionMsg("文件下載失敗"));
        }
        logger.info("FTPController download end");
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章