精华内容
下载资源
问答
  • 该案例使用SpringBoot 做了一个文件上传的案例,包括限制文件类型,文件大小等配置。
  • SpringBoot文件上传.zip

    2019-09-13 09:47:39
    SpringBoot2.x实现单文件和多文件上传,适合初学者学习 。
  • 本篇文章主要介绍了springboot 文件上传大小配置的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 里面是完整的案例 自己项目里面摘出来的 项目亲测有效
  • springboot文件上传下载

    2019-03-31 03:59:33
    springboot文件上传下载
  • 使用springboot实现文件的单个和多个上传,并解决系统兼容性及虚拟路径映射等多个问题
  • java springboot 文件上传,多文件上传,例子程序
  • 本篇文章主要介绍了详解SpringBoot文件上传下载和多文件上传(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
  • SpringBoot文件上传

    2020-01-04 17:15:36
    SpringBoot文件上传
  • 主要为大家详细介绍了SpringBoot实现文件上传接口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要介绍了SpringBoot文件上传控制的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 非常详细的描述了表单上传文件以及携带表单数据的案例,含有注释,前后端的代码,不懂可以加我问,随时回答
  • SpringBoot文件上传和下载 一、SpringBoot文件上传 1、SpringMVC文件上传 1、Client处理 选择文件 (1)form表单 选择文件 method="post" (2)enctype="multipart/form-data" (3) 准备文件框<input type=...

    SpringBoot文件上传和下载

    一、SpringBoot文件上传

    1、SpringMVC文件上传

    1Client处理 选择文件
       (1)form表单 选择文件 method="post"2)enctype="multipart/form-data"
        (3) 准备文件框<input type="file" name="upload">
    
    2、服务端准备存储上传文件的目录 新建文件夹
    项目/webapp/upload文件
    3、开发文件上传Controller
    public String fileUpload(MultipartFile upload){
    //接收数据
    //调用业务 接收的文件--》服务文件目录中 文件拷贝
    upload.transforTo(new File(父目录,当前文件名))
    //跳转页面
    return "ok" //ok.jsp
    }
    4、配置文件上传解析器CommonsMultipartResolver id必须为MulyipartResolver
    5、commons-fileUpload[引入] Commons-io
    

    2、SpringBoot文件上传

    • 文件上传所需依赖
    <!--集成springboot的父项目-->
      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
      </parent>
    
      <dependencies>
        <!--引入springboot的web依赖-->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入jsp解析相关依赖-->
        <dependency>
          <groupId>org.apache.tomcat.embed</groupId>
          <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
        <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.1</version>
        </dependency>
      </dependencies>
    
    
    • Application.yml文件配置
    server:
      port: 8080
      servlet:
        jsp:
          init-parameters.development: true #开启jsp页面的热部署
    spring:
      mvc:
        view:
          prefix: /
          suffix: .jsp
    

    (1)单个文件上传案例

    • 前端
    <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
    <html>
    <head>
    </head>
    <body>
    <form action="${pageContext.request.contextPath}/file/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="upload">
        <input type="submit" value="上传文件">
    </form>
    
    </body>
    </html>
    
    
    • 控制层
    @Controller
    @RequestMapping("file")
    public class upload {
        @RequestMapping("upload")
        public String upload(MultipartFile upload, HttpServletRequest request) throws IOException {
            String realPath = request.getSession().getServletContext().getRealPath("upload");
            //调用业务 文件拷贝
            //处理文件名 UUID拼串=uuid+"."+扩展名
            String s = UUID.randomUUID().toString().replace("-", "") + "." + FilenameUtils.getExtension(upload.getOriginalFilename());
            //调用业务 文件拷贝
            upload.transferTo(new File(realPath,s));
            return  "index";
        }
    }
    
    

    (2)多个文件上传案例

    • 前端
    <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
    <html>
    <head>
    </head>
    <body>
    <form action="${pageContext.request.contextPath}/file/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="upload"></br>
        <input type="file" name="upload"></br>
        <input type="file" name="upload">
        <input type="submit" value="上传文件">
    </form>
    
    </body>
    </html>
    
    
    • 控制层
    /**
     * @author 王恒杰
     * @date 2021/11/26 10:24
     * @Description:
     */
    @Controller
    @RequestMapping("file")
    public class upload {
        @RequestMapping("upload")
        public String upload(MultipartFile[] upload, HttpServletRequest request) throws IOException {
            for (int i = 0; i < upload.length; i++) {
                //考虑有用户没有上传文件
                if(upload[i]!=null){
                    String realPath = request.getSession().getServletContext().getRealPath("upload");
                    //处理文件名 UUID拼串=uuid+"."+扩展名 对文件名定义唯一标识
                    String s = UUID.randomUUID().toString().replace("-", "") + "." + FilenameUtils.getExtension(upload[i].getOriginalFilename());
                    //调用业务 文件拷贝
                    upload[i].transferTo(new File(realPath,s));
                }
            }
            return  "index";
        }
    }
    
    

    (3)文件上传大小设置

    • 上传三个视频大小大概有100M

    • 报错,显示文件太大

    • SpringBoot内置文件大小是10M

    • 我们应该在application.yml中对文件大小进行设置
    #修改文件上传大小的限制
      servlet:
        multipart:
          max-file-size:  209715200 #用来控制文件的上传
          max-request-size: 209715200  #用来指定服务端最大文件大小
    
    
    
    • application.properties
    #修改文件上传的大小限制
    #设置上传的文件大小
    spring.servlet.multipart.max-file-size=100MB
    #设置请求携带数据的大小
    spring.servlet.multipart.max-request-size=100MB
    

    二、文件下载

    1、SpringMvc中文件下载

    (1)在服务端文件系统中存储可以供下载的文件

    项目/webapp/download

                       aa.txt
    
                        bb.txt
    

    (2)在Client提供可以下载链接

    <a href="/项目名/file/download?fileName=aa.txt">下载 aa.txt</a>
    

    (3)开发文件下载Controller

    public String downLoad(String fileName,HttpRequest request,HttpResponse response){
      //接收数据 要下载的文件名
      //调用业务 服务器文件---》Client
         a、根据文件名去服务器上加载对应文件 输入流
         InputStream is=new FileInputStream(new File(request.getSession().getServletVContext().getRealPath("/download"),fileName));
         b、获取响应输出流
        PrintWriter out= response.getWriter();
        c、文件下载的方式 inline:浏览器尝试打开,默认形式 attachment:附件形式下载
        response.setHeader("content-disposition","attachment;filename="+ERLEncoder.encode(fileName,"UTF-8"))
        d、拷贝文件
        IOutil.copy(加载文件的输入流,响应输出流)
        e、关闭资源
        IoUtil.
      //跳转页面
      return null;
    }
    

    2、SpringBoot文件下载

    • 文件上传所需依赖
    <!--集成springboot的父项目-->
      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
      </parent>
    
      <dependencies>
        <!--引入springboot的web依赖-->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入jsp解析相关依赖-->
        <dependency>
          <groupId>org.apache.tomcat.embed</groupId>
          <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
        <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.1</version>
        </dependency>
      </dependencies>
    
    
    • Application.yml文件配置
    server:
      port: 8080
      servlet:
        jsp:
          init-parameters.development: true #开启jsp页面的热部署
    spring:
      mvc:
        view:
          prefix: /
          suffix: .jsp
    
    • 前端页面
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
    <html>
    <body>
    <h1>文件上传</h1>
    <a href="${pageContext.request.contextPath}/file/download?fileName=a.txt">下载 a.txt</a>
    <a href="${pageContext.request.contextPath}/file/download?fileName=b.txt">下载 b.txt</a>
    </body>
    </html>
    
    
    • 控制层
    @Controller
    @RequestMapping("file")
    public class upload {
        @RequestMapping("download")
        public String download(String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {
            //接收数据 文件名
            //文件下载
            //1、加载服务器指定名
            String realPath = request.getSession().getServletContext().getRealPath("/download");
            FileInputStream is = new FileInputStream(new File(realPath, fileName));
            //2、设置文件下载方式
            response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
            //3、获取响应输出流
            PrintWriter writer = response.getWriter();
            //4、流数据交换
            IOUtils.copy(is,writer);
            //5、关闭资源
            IOUtils.closeQuietly(is);
            IOUtils.closeQuietly(writer);
            return  null;
        }
    

    展开全文
  • SpringBoot Maven JDK1.8 IDEA开发的精简版的文件上传下载,包括多文件上传
  • 主要介绍了Springboot文件上传功能简单测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • springboot实现简单的上传与下载,源码 https://blog.csdn.net/weixin_43653670/article/details/112361435
  • Springboot实现文件上传

    2018-05-29 17:37:21
    Springboot实现文件上传,设置端口号,文件路径,返回界面调用图片得直接路径
  • Springboot文件上传并在线预览

    千次阅读 2020-11-18 17:20:29
    @PostMapping("/upload") //多文件上传 @RequestPart("files")MultipartFile[] files public Map,Object> fileupload(MultipartFile file, HttpServletRequest req) { Map, Object> result = new HashMap();...

    服务端接口

    在这里插入图片描述

    @RestController
    public class UploadController {
        SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
        @PostMapping("/upload")
        //多文件上传 @RequestPart("files")MultipartFile[] files
        public Map<String,Object> fileupload(MultipartFile file, HttpServletRequest req) {
            Map<String, Object> result = new HashMap<>();
            String format = sdf.format(new Date());
            String realPath = req.getServletContext().getRealPath("/") + format;
            File folder = new File(realPath);
            if (!folder.exists()) {
                folder.mkdirs();
            }
            String oldName = file.getOriginalFilename();
            String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));
            try {
           	 	//保存到文件服务器,oSS服务器
                file.transferTo(new File(folder, newName));//file.transferTo(new File("D:\\"+oldName));
                String url = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + format + newName;
                result.put("status", "OK");
                result.put("name", oldName);
                result.put("url", url);
            } catch (IOException e) {
                result.put("status", "ERROR");
                result.put("msg", e.getMessage());
            }
            return result;
        }
    }
    

    ##接口测试
    在这里插入图片描述

    Vue前端

    在这里插入图片描述

    • Vue模板
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <!-- 引入样式 -->
        <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    </head>
    <body>
    
    <!-- import Vue before Element -->
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <!-- import JavaScript -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <script>
    
    </script>
    </body>
    </html>
    

    参考链接
    文件上传实现详细描述


    Java 将 Word 文档转换为 PDF 的完美工具

    使用工具:https://www.e-iceblue.cn/Downloads/Free-Spire-Doc-JAVA.html(免费版)
    参考文章

    展开全文
  • 主要介绍了SpringBoot限制文件或图片上传大小的两种配置方法,一种是配置在启动类中,一种是配置在application.yml或者application.properties中,需要的朋友可以参考下
  • SpringBoot上传文件实例下载

    热门讨论 2017-03-11 17:51:25
    SpringBoot文件上传、批量文件上传。SpringMVC 也可以用。
  • 主要为大家详细介绍了java Springboot实现多文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • SpringBoot文件上传到数据库codewei•2020 年 06 月 11 日首先导入了相应的jar包org.thymeleafthymeleaf-spring5org.thymeleaf.extrasthymeleaf-extras-java8timemysqlmysql-connector-javaorg.mybatis.spring.boot...

    SpringBoot文件上传到数据库

    codewei • 2020 年 06 月 11 日

    首先导入了相应的jar包

    org.thymeleaf

    thymeleaf-spring5

    org.thymeleaf.extras

    thymeleaf-extras-java8time

    mysql

    mysql-connector-java

    org.mybatis.spring.boot

    mybatis-spring-boot-starter

    2.1.2

    com.alibaba

    druid

    1.1.22

    对数据源,mybatis,和上传文件进行配置spring:

    datasource:

    type: com.alibaba.druid.pool.DruidDataSource

    username: root

    password: shw123zxc

    url: jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

    driver-class-name: com.mysql.cj.jdbc.Driver

    servlet:

    multipart:

    max-request-size: 10MB #上传文件的最大总大小

    max-file-size: 10MB #上传单个文件的最大大小

    mybatis:

    type-aliases-package: cn.codewei.pojo

    mapper-locations: classpath:/mapper/*.xml

    然后写一个文件上传的html,注意表单的==enctype==属性要设置为==multipart/form-data==

    Title

    文件上传

    然后写一个Mapper和对应的Mapper.xml和service@Mapper

    @Repository

    public interface PhotoMapper {

    // 向数据库中添加图片

    public int addPhoto(Photo photo);

    // 从数据库中取出图片

    public Photo getPhotoById(@Param("id") int id);

    }<?xml version="1.0" encoding="UTF-8" ?>

    /p>

    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    insert into image values (#{id},#{photo},#{photo_name},#{photo_type})

    select * from image where id=#{id}

    在Controller中进行调用

    上传@Autowired

    private PhotoService photoService;

    @Autowired

    private Photo photo;

    @PostMapping("/upload")

    @ResponseBody

    public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {

    byte[] bytes = file.getBytes();

    photo.setPhoto(bytes);

    photo.setPhoto_name(file.getOriginalFilename());

    photo.setPhoto_type(".jpg");

    photoService.addPhoto(photo);

    return "上传成功!";

    }

    取出,在页面中显示@RequestMapping("/getPhoto")

    public String getImage(HttpServletResponse response) throws IOException {

    Photo photo = photoService.getPhotoById(1);

    byte[] photo1 = photo.getPhoto();

    ServletOutputStream os = response.getOutputStream();

    os.write(photo1);

    os.close();

    return "";

    }

    Title

    首页

    getPhoto

    展开全文
  • 主要介绍了SpringBoot 文件上传和下载的实现源码,代码简单易懂非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • SpringBoot 实现文件上传到本地目录 并返回可访问的文件地址
  • SpringBoot 文件上传 通过Content-Type和文件头判断文件类型 一、关于MIME MIME的全称是Multipurpose Internet Mail Extensions,即多用途互联网邮件扩展,尽管读起来有些拗口,但大多数人可能都知道, 这是HTTP协议...

    SpringBoot 文件上传 通过Content-Type和文件头判断文件类型

    一、关于MIME

    MIME的全称是Multipurpose Internet Mail Extensions,即多用途互联网邮件扩展,尽管读起来有些拗口,但大多数人可能都知道,
    这是HTTP协议中用来定义文档性质及格式的标准。IETF RFC 6838,对HTTP传输内容类型进行了全面定义。
    IANA(互联网号码分配机构)是负责管理所有标准MIME类型的官方机构。可以在这里)找到所有的标准MIME

    服务器通过MIME告知响应内容类型,而浏览器则通过MIME类型来确定如何处理文档;
    因此为传输内容(文档、图片等)设置正确的MIME非常重要

    通常Server会在HTTP响应中设置Content-Type,如下面的响应:

    HTTP/1.1 200 OK
    Server: Golfe2    
    Content-Length: 233
    Content-Type: application/html
    Date: Sun, 28 Dec 2018 02:55:19 GMT
    

    这表示服务端将返回html格式的文档,而同样客户端也可以在HTTP请求中设置Content-Type以告知服务器当前所发送内容的格式。
    如下面的请求体:

    POST / HTTP/1.1
    Host: localhost:8000
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Connection: keep-alive
    Content-Type: application/json
    Content-Length: 465
    

    这表示客户端会发送application/json格式的数据到服务端,同时应该注意到Accept请求头,这个选项用于告知服务器应该返回什么样的数据格式(由客户端接收并完成解析)。

    MIME的格式

    type/subtype
    

    这是一个两级的分类,比较容易理解,第一级分类通常包含:

    类型描述
    text普通文本
    image某种图像
    audio某种音频文件
    video某种视频文件
    application应用数据
    multi-part复合内容

    而二级类型则非常多,以下是一些常用的MIME:

    MIME描述
    audio/wavwave音频流媒体文件
    audio/webmwebm 音频文件格式
    audio/oggogg多媒体文件格式的音频文件
    audio/mpegmpeg多媒体文件格式的音频文件
    image/gifgif图片
    image/jpegjpeg图片
    image/pngpng图片
    image/svg+xmlsvg矢量图片
    application/jsonjson格式
    application/xmlxml格式
    application/xhtml+xml扩展html格式
    application/x-www-form-urlencoded表单url内容编码
    application/octet-stream二进制格式
    application/pdfpdf文档
    application/atom+xmlatom订阅feed流
    multipart/form-data多文档格式
    text/plain普通文本
    text/htmlhtml文档
    text/csscss文件
    text/javascriptjavascript文件
    text/markdownmarkdown文档
    video/mpegmpeg多媒体视频文件
    video/quicktimemov多媒体视频文件

    MIME Type 与 Content-Type 的关系

    首先看看tomcat服务器中默认的web.xml中的描述:

    <!-- ===================== Default MIME Type Mappings =================== -->
    <!-- When serving static resources, Tomcat will automatically generate    -->
    <!-- a "Content-Type" header based on the resource's filename extension, -->
    <!-- based on these mappings. Additional mappings can be added here (to -->
    <!-- apply to all web applications), or in your own application's web.xml -->
    <!-- deployment descriptor.   -->
    

    再看看apache服务器中mime.types的描述:

    This file controls what Internet media types are sent to the client for
    given file extension(s). Sending the correct media type to the client
    is important so they know how to handle the content of the file.
    Extra types can either be added here or by using an AddType directive
    in your config files. For more information about Internet media types,
    please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type registry is at http://www.iana.org/assignments/media-types/.
    

    当web服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME Type,再根据MIME Type设置HTTP Response的Content-Type,然后浏览器根据Content-Type的值处理文件。

    也就是说, 文件扩展名=>MIME Type=>Content-Type

    通过文件头识别文件

    不同的文件类型有不同的文件头, 而文件头部的几个字节被称为Magic Number, 通常用十六进制表示, 可用来判断文件类型.

    比如png文件的文件头Magic Number是0x89504E开始的, java class文件Magic Number为Oxcafebabe

    我们可以通过判断文件的文件头信息来判断文件的类型, 而且即使改变文件扩展名文件头信息也是不改变的.

    通过java代码判断文件类型:

    public class FileType {
    
        //默认判断文件头前三个字节内容
        public static int CHECK_BYTES_NUMBER = 3;
    
        public final static Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>();
    
        private FileType(){}
        static{
            getAllFileType(); //初始化文件类型信息
        }
    
        /**
         * Discription:[getAllFileType,常见文件头信息]
         */
        private static void getAllFileType()
        {
            FILE_TYPE_MAP.put("ffd8ffe000104a464946", "jpg"); //JPEG (jpg)
            FILE_TYPE_MAP.put("89504e470d0a1a0a0000", "png"); //PNG (png)
            FILE_TYPE_MAP.put("47494638396126026f01", "gif"); //GIF (gif)
            FILE_TYPE_MAP.put("49492a00227105008037", "tif"); //TIFF (tif)
            FILE_TYPE_MAP.put("424d228c010000000000", "bmp"); //16色位图(bmp)
            FILE_TYPE_MAP.put("424d8240090000000000", "bmp"); //24位位图(bmp)
            FILE_TYPE_MAP.put("424d8e1b030000000000", "bmp"); //256色位图(bmp)
            FILE_TYPE_MAP.put("41433130313500000000", "dwg"); //CAD (dwg)
            FILE_TYPE_MAP.put("3c21444f435459504520", "html"); //HTML (html)
            FILE_TYPE_MAP.put("3c21646f637479706520", "htm"); //HTM (htm)
            FILE_TYPE_MAP.put("48544d4c207b0d0a0942", "css"); //css
            FILE_TYPE_MAP.put("696b2e71623d696b2e71", "js"); //js
            FILE_TYPE_MAP.put("7b5c727466315c616e73", "rtf"); //Rich Text Format (rtf)
            FILE_TYPE_MAP.put("38425053000100000000", "psd"); //Photoshop (psd)
            FILE_TYPE_MAP.put("46726f6d3a203d3f6762", "eml"); //Email [Outlook Express 6] (eml)
            FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "doc"); //MS Excel 注意:word、msi 和 excel的文件头一样
            FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "vsd"); //Visio 绘图
            FILE_TYPE_MAP.put("5374616E64617264204A", "mdb"); //MS Access (mdb)
            FILE_TYPE_MAP.put("252150532D41646F6265", "ps");
            FILE_TYPE_MAP.put("255044462d312e350d0a", "pdf"); //Adobe Acrobat (pdf)
            FILE_TYPE_MAP.put("2e524d46000000120001", "rmvb"); //rmvb/rm相同
            FILE_TYPE_MAP.put("464c5601050000000900", "flv"); //flv与f4v相同
            FILE_TYPE_MAP.put("00000020667479706d70", "mp4");
            FILE_TYPE_MAP.put("49443303000000002176", "mp3");
            FILE_TYPE_MAP.put("000001ba210001000180", "mpg"); //
            FILE_TYPE_MAP.put("3026b2758e66cf11a6d9", "wmv"); //wmv与asf相同
            FILE_TYPE_MAP.put("52494646e27807005741", "wav"); //Wave (wav)
            FILE_TYPE_MAP.put("52494646d07d60074156", "avi");
            FILE_TYPE_MAP.put("4d546864000000060001", "mid"); //MIDI (mid)
            FILE_TYPE_MAP.put("504b0304140000000800", "zip");
            FILE_TYPE_MAP.put("526172211a0700cf9073", "rar");
            FILE_TYPE_MAP.put("235468697320636f6e66", "ini");
            FILE_TYPE_MAP.put("504b03040a0000000000", "jar");
            FILE_TYPE_MAP.put("4d5a9000030000000400", "exe");//可执行文件
            FILE_TYPE_MAP.put("3c25402070616765206c", "jsp");//jsp文件
            FILE_TYPE_MAP.put("4d616e69666573742d56", "mf");//MF文件
            FILE_TYPE_MAP.put("3c3f786d6c2076657273", "xml");//xml文件
            FILE_TYPE_MAP.put("494e5345525420494e54", "sql");//xml文件
            FILE_TYPE_MAP.put("7061636b616765207765", "java");//java文件
            FILE_TYPE_MAP.put("406563686f206f66660d", "bat");//bat文件
            FILE_TYPE_MAP.put("1f8b0800000000000000", "gz");//gz文件
            FILE_TYPE_MAP.put("6c6f67346a2e726f6f74", "properties");//bat文件
            FILE_TYPE_MAP.put("cafebabe0000002e0041", "class");//bat文件
            FILE_TYPE_MAP.put("49545346030000006000", "chm");//bat文件
            FILE_TYPE_MAP.put("04000000010000001300", "mxp");//bat文件
            FILE_TYPE_MAP.put("504b0304140006000800", "docx");//docx文件
            FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "wps");//WPS文字wps、表格et、演示dps都是一样的
            FILE_TYPE_MAP.put("6431303a637265617465", "torrent");
    
    
            FILE_TYPE_MAP.put("6D6F6F76", "mov"); //Quicktime (mov)
            FILE_TYPE_MAP.put("FF575043", "wpd"); //WordPerfect (wpd)
            FILE_TYPE_MAP.put("CFAD12FEC5FD746F", "dbx"); //Outlook Express (dbx)
            FILE_TYPE_MAP.put("2142444E", "pst"); //Outlook (pst)
            FILE_TYPE_MAP.put("AC9EBD8F", "qdf"); //Quicken (qdf)
            FILE_TYPE_MAP.put("E3828596", "pwl"); //Windows Password (pwl)
            FILE_TYPE_MAP.put("2E7261FD", "ram"); //Real Audio (ram)
        }
    
    
        /**
         * 根据制定文件的文件头判断其文件类型
         * @param filePaht
         * @return
         */
        public static String getFileType(String filePaht){
            String res = null;
    
            try {
                FileInputStream is = new FileInputStream(filePaht);
                getFileType(is);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            return res;
        }
        public static String getFileType(InputStream in){
            String res = null;
            try {
    
                byte[] b = new byte[CHECK_BYTES_NUMBER];
                in.read(b, 0, b.length);
                String fileCode = bytesToHexString(b);
    
    //            System.out.println(fileCode);
    
    
                //这种方法在字典的头代码不够位数的时候可以用但是速度相对慢一点
                Iterator<String> keyIter = FILE_TYPE_MAP.keySet().iterator();
                while(keyIter.hasNext()){
                    String key = keyIter.next();
                    if(key.toLowerCase().startsWith(fileCode.toLowerCase()) || fileCode.toLowerCase().startsWith(key.toLowerCase())){
                        res = FILE_TYPE_MAP.get(key);
                        break;
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return res;
        }
    
        /**
         * 得到上传文件的文件头
         * @param src
         * @return
         */
        public static String bytesToHexString(byte[] src) {
            StringBuilder stringBuilder = new StringBuilder();
            if (src == null || src.length <= 0) {
                return null;
            }
            for (int i = 0; i < src.length; i++) {
                int v = src[i] & 0xFF;
                String hv = Integer.toHexString(v);
                if (hv.length() < 2) {
                    stringBuilder.append(0);
                }
                stringBuilder.append(hv);
            }
            return stringBuilder.toString();
        }
    
        public static int getCheckBytesNumber() {
            return CHECK_BYTES_NUMBER;
        }
    
        public static void setCheckBytesNumber(int checkBytesNumber) {
            CHECK_BYTES_NUMBER = checkBytesNumber;
        }
    }
    

    常见文件头表示如下:

    255044PDF
    526563 EML
    D0CF11 PPT
    4D5AEE COM
    E93B03 COM
    4D5A90 EXE
    424D3E BMP
    49492A TIF
    384250 PSD
    C5D0D3 EPS
    0A0501 PCS
    89504E PNG
    060500 RAW
    000002 TGA
    60EA27 ARJ
    526172 RAR
    504B03 ZIP
    495363 CAB
    1F9D8C Z
    524946 WAV
    435753 SWF
    3026B2 WMV
    3026B2 WMA
    2E524D RM
    00000F MOV
    000077 MOV
    000001 MPA
    FFFB50 MP3
    234558 m3u
    3C2144 HTM
    FFFE3C XSL
    3C3F78 XML
    3C3F78 MSC
    4C0000 LNK
    495453 CHM
    805343 scm
    D0CF11 XLS
    31BE00 WRI
    00FFFF MDF
    4D4544 MDS
    5B436C CCD
    00FFFF IMG
    FFFFFF SUB
    17A150 PCB
    2A5052 ECO
    526563 PPC
    000100 DDB
    42494C LDB
    2A7665 SCH
    2A2420 LIB
    434841 FNT
    7B5C72 RTF
    7B5072 GTD
    234445 PRG
    000007 PJT
    202020 BAS
    000002 TAG
    4D5A90 dll
    4D5A90 OCX
    4D5A50 DPL
    3F5F03 HLP
    4D5A90 OLB
    4D5A90 IMM
    4D5A90 IME
    3F5F03 LHP
    C22020 NLS
    5B5769 CPX
    4D5A16 DRV
    5B4144 PBK
    24536F PLL
    4E4553 NES
    87F53E GBC
    00FFFF SMD
    584245 XBE
    005001 XMV
    000100 TTF
    484802 PDG
    000100 TST
    414331 dwg
    D0CF11 max

    另外还有一些重要的文件,没有固定的文件头,如下:

    TXT 没固定文件头定义
    TMP 没固定文件头定义
    INI 没固定文件头定义
    BIN 没固定文件头定义
    DBF 没固定文件头定义
    C 没没固定文件头定义
    CPP 没固定文件头定义
    H 没固定文件头定义
    BAT 没固定文件头定义

    还有一些不同的文件有相同的文件头,最典型的就是下面:

    4D5A90 EXE
    4D5A90 dll
    4D5A90 OCX
    4D5A90 OLB
    4D5A90 IMM
    4D5A90 IME

    文件上传

    当我们需要实现上传文件的时候, 为了安全起见, 我们需要判断上传文件的格式, 防止将病毒木马等有害的文件上传到服务器上.

    判断文件类型的三种方式

    • 通过文件后缀名

      这个方法只要修改后缀名就可以了

    • 通过Content-Type判断

      但是Content-Type取决于文件类型, 文件类型取决于文件扩展名, 所以改变了文件扩展名就改变了Content-Type

    • 通过文件头判断文件, 即使文件扩展名改变了文件头也不会改变

    文件上传的思路: 先判断Content-Type, Content-Type符合条件的再判断文件头信息

    @ResponseBody
        @GetMapping("validate")
        public Map<String, String> validate(@Validated({AllFiled.class}) UserInfo userInfo, BindingResult result){
    
    //        SpringValidatorAdapter adapter = (SpringValidatorAdapter)result;
    
            Map<String, String> map = new HashMap<String, String>();
            if (result.hasErrors()) {
                List<ObjectError> list  = result.getAllErrors();
                for (ObjectError error :
                        list) {
                    FieldError fieldError = (FieldError)error;
                    String defaultMessage = fieldError.getDefaultMessage();
                    String field = fieldError.getField();
                    map.put(field, defaultMessage);
                }
            }
            return map;
        }
    //    consumes = {
    //        MediaType.MULTIPART_FORM_DATA_VALUE }, produces = MediaType.TEXT_PLAIN_VALUE
        @PostMapping(value = "file")
        @ResponseBody
        public String file(@RequestParam("username") String name, MultipartFile file) throws IOException {
    
            //获取文件名
            String fileName = file.getOriginalFilename();
            //获取表单提交文件使用的字段
            String partName = file.getName();
            //判断文件是否为空
            boolean empty = file.isEmpty();
            //获取ContentType
            String contentType = file.getContentType();
            //获取文件直接数
            Long size = file.getSize();
            //获取文件所有字节
            byte[] bytes = file.getBytes();
            //获取InputStream
            InputStream in = file.getInputStream();
            //根据文件头获取文件类型
            String type = FileType.getFileType(in);
            
            //业务.....
    
            StringBuilder builder = new StringBuilder();
    
            //存储文件
            File root = new File("D:/temp");
            if (!root.isDirectory()) {
                root.mkdirs();
            }
            try {
                file.transferTo(new File(root, name));
                return String.format("Upload to %s", fileName);
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "Upload Failed";
        }
    
    展开全文
  • 主要为大家详细介绍了SpringBoot后台实现文件上传下载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 文件上传 我这次用的是springboot,先说一下用法吧。 先要前端写一个form表单,然后写一个文件上传的input 最重要的就是 enctype=“multipart/form-data” method="post" 一定要写这个不然后端接收不到会报错 <...
  • 主要介绍了SpringBoot文件访问映射如何实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • springboot文件上传与下载

    千次阅读 2018-12-01 16:53:57
    springboot文件上传与下载 1.添加依赖 &amp;amp;amp;amp;amp;lt;dependency&amp;amp;amp;amp;amp;gt; &amp;amp;amp;amp;amp;lt;groupId&amp;amp;amp;amp;amp;gt;commons-fileupload&amp;amp...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,490
精华内容 19,396
关键字:

springboot文件上传

spring 订阅
友情链接: KMV方程.zip