關於下載遠程文件為未知文件.txt的解決方法


本地下載文件后綴正常,服務器下載文件后綴都為.txt的解決方法:

后綴為 未知文件.txt 的原因為前端無權限獲取Content-Disposition中的文件名

response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
//將文件名設置到 Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
// 這一行一定要加 意為允許前端獲取Content-Disposition的文件名 
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");

下載遠程文件代碼:

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>

需引入commons-io使用IOUtils

此處文件路徑例如:http://127.0.0.1:8085/upload/1_1612234092195.jpg

    /**
     * 流下載
     * @param request HttpServletRequest
     * @param response HttpServletResponse
     * @param filePath 文件路徑
     */
public void downloadFile(HttpServletRequest request, HttpServletResponse response, String filePath) {
    OutputStream os = null; //輸出流
    try {
        os = response.getOutputStream();

        //獲取文件名
        String fileName = downloadFileDTO.getFilePath().substring(filePath.lastIndexOf("/")+1);

        response.setHeader("content-type", "application/octet-stream");
        response.setContentType("application/octet-stream");
  
		//將文件名設置到 Content-Disposition
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
        
        //允許前端獲取Content-Disposition中的文件名
        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");

        URL url = new URL (filePath);
        URLConnection uc = url.openConnection();
        IOUtils.copy(uc.getInputStream(), os);
        os.flush();

    }catch (Exception e){
        log.error("下載文件失敗:{}",e.getMessage());
    }finally {
        try {
            if(os !=null){
                os.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM