zoukankan      html  css  js  c++  java
  • springboot-实现文件下载

    一 前言

    本文实现的文件下载是使用Apache 的 commons-fileupload 实现;在之前的springboot系列文件中已经讲述过如何实现多文件上传;这篇文件实现的文件下载功能主要是能在浏览器在线预览或者下载至本地;

    二 pom依赖

    	<parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.1.RELEASE</version>
            <relativePath/>
        </parent>
    	 <dependencies>
    	        <dependency>
    	            <groupId>commons-fileupload</groupId>
    	            <artifactId>commons-fileupload</artifactId>
    	            <version>1.3.3</version>
    	        </dependency>
    	        <dependency>
    	            <groupId>org.springframework.boot</groupId>
    	            <artifactId>spring-boot-starter-web</artifactId>
    	        </dependency>
    	    </dependencies>
        
    

    三 文件下载示例

    参数 path 表示相对于根路径的相对路径
    参数userAgent 是为了兼容IE判断,如果使用谷歌,火狐浏览器就可以省略这个参数;
    参数 filename 表示你下载至本地的文件名;
    参数 inline表示是否要在线浏览,true是,false否;

    /**
     * @Author lsc
     * @Description <p> 文件下载</p>
     * @Date 2019/11/20 11:54
     */
    @RestController
    @RequestMapping("file")
    public class DownloadController {
    	// 下载文件的根路径
        private String downloadPath = "C:\mydata\generator";
    
        @GetMapping("download")
        public ResponseEntity<byte[]> downlaodFile(HttpServletRequest request, @RequestParam("path") String path
                , @RequestHeader("user-agent") String userAgent, @RequestParam("filename") String filename
                ,@RequestParam(required = false,defaultValue = "false") boolean inline ) {
    		// 根路径加上传参数的路径构成文件路径地址
            String realPath = downloadPath + path;
            File file = new File(realPath);
            // 构建响应
            ResponseEntity.BodyBuilder bodyBuilder = ResponseEntity.ok();
            bodyBuilder.contentLength(file.length());
            // 二进制数据流
            bodyBuilder.contentType(MediaType.APPLICATION_OCTET_STREAM);
            // 文件名编码
            try {
                String encodeFileName = URLEncoder.encode(filename, "UTF-8");
                // IE
                if (userAgent.indexOf("MSIE")>0){
                    bodyBuilder.header("Content-Disposition","attachment;filename="+encodeFileName);
                }else {
                    // 其他浏览器
                    if (inline){
                        // 在浏览器中打开
                        URL url = new URL("file:///" + file);
                        bodyBuilder.header("Content-Type",url.openConnection().getContentType());
                        bodyBuilder.header("Content-Disposition","inline;filename*=UTF-8''"+encodeFileName);
                    }else {
                        // 直接下载
                        bodyBuilder.header("Content-Disposition","attachment;filename*=UTF-8''"+encodeFileName);
                    }
    
                }
                // 下载成功返回二进制流
                 return bodyBuilder.body(FileUtils.readFileToByteArray(file));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }catch (IOException e) {
                e.printStackTrace();
            }
            // 下载失败直接返回错误的请求
            return (ResponseEntity<byte[]>) ResponseEntity.badRequest();
    
        }
    
    }
    

    四 tomcat配置

    主要是开发特殊字符斜杆,如果是在linux上开发,那就自定义路径,这个步骤可以省略;

    @Configuration
    public class ServerConfig {
    
        //Url路径添加支持字符
        @Bean
        public ConfigurableServletWebServerFactory webServerFactory() {
            //设置Tomcate 支持
            TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
            factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                @Override
                public void customize(Connector connector) {
                    connector.setProperty("relaxedQueryChars", "\");
                }
            });
            return factory;
        }
    
    }
    

    五 浏览器测试

    下载路径
    http://localhost:8080/file/download?path=201911c7ed67a6-5502-479b-8934-736021426236.jpg&filename=5555.jpg

    生成结果
    在这里插入图片描述

    六 源码

    github : youku1327

    在这里插入图片描述

  • 相关阅读:
    多线程中lock用法
    跨域使用Proxy page或Cross Frame
    new 操作符所做的事情
    跨域使用js文件
    跨域使用window.name
    TFS 映射错误( is already mapped in workspace)解决办法
    跨域使用JSONP
    jquery加载页面中的部分内容
    CQRS架构案例Tiny Library CQRS详解:AOP拦截与异常处理
    面向领域驱动架构的查询实现方式
  • 原文地址:https://www.cnblogs.com/zszxz/p/12163138.html
Copyright © 2011-2022 走看看