文件下載常見問題(亂碼、文件白版、黑版、文件只有一半、文件打不開)

問題1:爲什麼我下載的圖片只有半張。或者我下的文件打開報文件損壞。

原因:你可能採用的是寫法是:https://www.jianshu.com/p/0951086020d9

byte[] buffer = new byte[inputStream.available() 這個是罪魁禍首。這個返回的僅僅是可讀取字節數。並不一定是我們文件的大小。所以我們應該採用的方式是:

byte[] buffer = new byte[inputStream.available()];
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            int n;
            while ((n = inputStream.read(buffer)) != -1) {
                toClient.write(buffer, 0, n);
            }

問題2:爲什麼我下載的圖片的名字英文名是好的,中文名是下滑線

原因是:你沒有按照正確的格式返回,就是數據的字符格式沒有設置正確。

解決方案是:

response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileBean.getName(),"UTF-8"));
          

問題2:爲什麼我下載的圖片的名字英文名是好的,中文名是一個加密後的名字

原因是:恭喜你,這不是你的原因,前端同學得對該數據進行轉義

這個我寫的幾種下載方式:

/**
     * 下載文件
     *
     * @param fileBean
     * @return
     */
    @RequestMapping(path = "/download2", method = RequestMethod.POST, produces="application/json;charset=UTF-8")
    public HttpServletResponse download2(@RequestBody FileBean fileBean,HttpServletResponse response) {
            try {
                //入參  桶名,文件名
                ObjectRequest objectRequest = new ObjectRequest(BUCKET_NAME,fileBean.getFilePath());
                //下載的文件流
                InputStream inputStream = mssClientObjectService.getObject(objectRequest);
                //具體的業務操作
                //2、創建字節輸出流
                byte[] b = new byte[1024];
                //2、創建字節輸出流
                OutputStream sos = response.getOutputStream();
                int len ;
                while((len=inputStream.read(b)) != -1){
                    sos.write(b,0 , len);
                }
                sos.close();
                inputStream.close();
                // 清空response
                response.reset();
                // 設置response的Header
                response.addHeader("Content-Disposition",
                        "attachment;filename=" + new String(fileBean.getName().getBytes()));
                response.addHeader("Content-Length",
                        "" + b.length);
                response.setContentType("application/octet-stream");
            } catch (AmazonClientException | IOException e) {
                log.error("DPL:down File error :{}",fileBean,e);
            }
            return response;

    }
    /**
     * 下載文件
     *
     * @param fileBean
     * @return
     */
    @RequestMapping(path = "/download3", method = RequestMethod.POST, produces="application/json;charset=UTF-8")
    public HttpServletResponse download3(@RequestBody FileBean fileBean,HttpServletResponse response) {
        try {
            //入參  桶名,文件名
            ObjectRequest objectRequest = new ObjectRequest(BUCKET_NAME,fileBean.getFilePath());
            //下載的文件流
            InputStream inputStream = mssClientObjectService.getObject(objectRequest);
            //2、創建字節輸出流
            byte[] b = new byte[inputStream.available()];
            //2、創建字節輸出流
            OutputStream sos = new BufferedOutputStream(response.getOutputStream());
            int n;
            while((n = inputStream.read(b)) != -1){
                sos.write(b,0,n);
            }
            inputStream.close();
            sos.flush();
            sos.close();
            // 設置response的Header
            response.addHeader("Content-Disposition",
                    "attachment;filename=" + new String(fileBean.getName().getBytes()));
            response.addHeader("Content-Length",
                    "" + b.length);
            response.setContentType("application/octet-stream");
        } catch (AmazonClientException | IOException e) {
            log.error("DPL:down File error :{}",fileBean,e);
        }
        return response;
    }

    /**
     * 下載文件
     *
     * @param fileBean
     * @return
     */
    @RequestMapping(path = "/download", method = RequestMethod.POST, produces="application/json;charset=UTF-8")
    public HttpServletResponse download(@RequestBody FileBean fileBean,HttpServletResponse response) {
        try {
            //入參  桶名,文件名
            ObjectRequest objectRequest = new ObjectRequest(BUCKET_NAME,fileBean.getFilePath());
            //下載的文件流
            InputStream inputStream = mssClientObjectService.getObject(objectRequest);
            //具體的業務操作
            byte[] buffer = toByteArray(inputStream);
            inputStream.close();
            // 清空response
            response.reset();
            // 設置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileBean.getName(),"UTF-8"));
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (AmazonClientException | IOException e) {
            log.error("DPL:down File error :{}",fileBean,e);
        }
        return response;
    }

    private byte[] toByteArray(InputStream input) throws IOException {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        byte[] buffer = new byte[input.available()];
        int n;
        while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
        }
        return output.toByteArray();
    }

    /**
     * 下載文件
     *
     * @param fileBean
     * @return
     */
    @RequestMapping(path = "/download4", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
    public HttpServletResponse download4(@RequestBody FileBean fileBean, HttpServletResponse response) {
        try {
            // 清空response
            response.reset();
            //入參  桶名,文件名
            ObjectRequest objectRequest = new ObjectRequest(BUCKET_NAME, fileBean.getFilePath());
            //下載的文件流
            InputStream inputStream = mssClientObjectService.getObject(objectRequest);
            //具體的業務操作
            byte[] buffer = new byte[inputStream.available()];
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            int n;
            while ((n = inputStream.read(buffer)) != -1) {
                toClient.write(buffer, 0, n);
            }
            // 設置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileBean.getName().getBytes()));
            response.setContentType("application/octet-stream");
            inputStream.close();
            toClient.flush();
            toClient.close();

        } catch (AmazonClientException | IOException e) {
            log.error("DPL:down File error :{}", fileBean, e);
        }
        return response;
    }

 

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