文件下載和二進制文件(圖片、mp4視頻)預覽響應頭的設置(防止中文名名亂碼)

工作中文件下載是一個非常常見的功能,但請求頭設置卻經常容易忘記。這裏寫一個樣例供大家參考。這裏設置文件編碼格式,主要防止下載文件中文名亂碼。

一、文件下載

1、主要設置 下載的類型
2、設置下載文件的名稱

 @GetMapping("/downloadFile")
    public void downloadFile(HttpServletResponse response,@RequestParam("fileContent") Integer fileContent) {
        File file = null;
        try {

            file = new File(fileContentMap.get(fileContent));
            byte[] buff = new byte[1024];
            String fileName = new String(file.getName().getBytes(), "ISO8859-1");

            response.setHeader("content-type", "application/octet-stream;charset=ISO8859-1");
            response.setContentType("application/octet-stream;charset=ISO8859-1");
            response.setHeader("Content-disposition", String.format("attachment;filename=\"%s\"", fileName));
            response.setHeader("Content-Length", String.valueOf(file.length()));
            ServletOutputStream os = response.getOutputStream();
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

            int i=bis.read(buff);
            while (i != -1) {
                os.write(buff, 0, i);
                os.flush();
                bis.read(buff);
            }

        } catch (IOException e) {
            logger.error("viewFile fail fileName is {}", Objects.isNull(file) ? "加載文件是失敗" : file.getName(), e);
        }

    }

二、進制視頻文件mp4,及圖片預覽設置

這裏是設置預覽功能是通過二進制方式,這裏需要注意的是,通過二進制預覽並不是一個特別好的方式。

private static Map<Integer, String> fileContentMap = new HashMap<Integer,String>();

    static {
        fileContentMap.put(1, "F:\\xxx\\xx.mp4");
        fileContentMap.put(2, ""F:\\xxx\\xx..zip");
        fileContentMap.put(3, ""F:\\xxx\\xx.docx");
        fileContentMap.put(4, ""F:\\xxx\\xx..bmp");
        fileContentMap.put(5, ""F:\\xxx\\xx..png");
    }
   /**
     * 文件預覽
     */
    private static Logger logger = LoggerFactory.getLogger(UserController.class);
    @GetMapping("/viewFile")
    public void viewFile(HttpServletResponse response,@RequestParam("fileContent") Integer fileContent) {
        File file = null;
        try {
            file = new File(fileContentMap.get(fileContent));
            String fileName = file.getName();
            String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();


            if ("mp4".equals(fileType)) {
                response.setHeader("content-type", "video/mp4");
            } else if ("jpg,jpeg,gif,png,bmp".contains(fileType)) {
                response.setHeader("content-type", "image/" + fileType);
            } else {
                response.setHeader("Content-disposition", String.format("attachment;filename=\"%s\"", new String(fileName.getBytes(), "ISO8859-1")));
                response.setHeader("Content-Length", String.valueOf(file.length()));
                response.setHeader("content-type", "application/octet-stream;charset=ISO8859-1");
                response.setContentType("application/octet-stream;charset=ISO8859-1");


            }

            byte[] buff = new byte[1024];

            ServletOutputStream os = response.getOutputStream();
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            int i=bis.read(buff);
            while (i != -1) {
                os.write(buff, 0, i);
                os.flush();
                bis.read(buff);
            }

        } catch (IOException e) {
            logger.error("viewFile fail fileName is {}", Objects.isNull(file) ? "加載文件是失敗" : file.getName(), e);
        }

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