zoukankan      html  css  js  c++  java
  • 关于下载远程文件为未知文件.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();
            }
        }
    }
    
  • 相关阅读:
    C++中public、protected、private的差别
    TSP问题
    Android百日程序:绘画程序-画手指路径
    DFS csu1719 Boggle
    Oracle数据库imp
    <html>
    SWIFT学习笔记05
    Xcode7 真机免证书调试Cocos2D游戏
    mycat 不得不说的缘分
    HashMap和Hashtable的差别
  • 原文地址:https://www.cnblogs.com/csyzlm/p/14361119.html
Copyright © 2011-2022 走看看