导包

需要导入如下的包

commons-fileupload-1.3.3.jar

commons-io-2.6.jar


修改表单类型

想要上传图片、文本、电影、音乐等资源的时候,需要将 form 的类型改为 multipart/form-data

<form enctype="multipart/form-data">

配置解析器

在 springMvc.xml 文件中进行配置 ;

<!--配置图片、音乐等文件的解析器-->
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--限制上文最大为5M 1024*1024*5-->
<property name="maxInMemorySize">
<value>5242880 </value>
</property>
</bean>

处理上传的图片

springMvc 对这类型的数据,也支持 参数绑定 ,使用 MultipartFile 接收 ,注意页面上的 name 属性的值和形参名一致,老生常谈的事了;

MultipartFile 的一些基本操作 :

//        获取上传的文件名
String oldFile = multipartFile.getOriginalFilename() ;
// 将上传的文件,从内存中写到硬盘上
multipartFile.transferTo(path);

补充一个自己写的工具类

之前写的过于简单,补充下一个实例;
  1. 上传文件

    先判断 HttpServletRequest 是否是 MultipartHttpServletRequest 的实例,如果不是,则表示 HttpServletRequest 只是一个普通的 request ,并没有带文件过来,当然网上还有其他好几种判断方法,这是我常用的一种;

      public String upLoadExcel(HttpServletRequest request) {
    JSONObject jsonObject = new JSONObject();
    if (!(request instanceof MultipartHttpServletRequest)) {
    jsonObject.put("result", "0");
    jsonObject.put("resultInfo", "没有选中任何文件");
    return jsonObject.toJSONString();
    }
    ...
    }

    如果HttpServletRequest 是 MultipartHttpServletRequest 的实例,则进行强转,将 HttpServletRequest 转成 MultipartHttpServletRequest 的实例;然后获取上传的文件:

    首先说明下,上传的文件的情况,它是一个 Map 中套 List 的情况。

    因此,获取文件,需要先获取外层的 Map ,MultipartHttpServletRequest提供了获取其迭代器的方法:

    Iterator<String> iterator = request.getFileNames();

    这样就获取了所有的文件名,注意下 Map 里面套的是 List 因此,这些名字就是 Map 的键,一个键对应一个值 List ,就是说一个文件名可以对应多个文件。

    根据文件名获取其对应的 List :

    List<MultipartFile> files = request.getFiles(fileName);

    这样就获取到了一个文件对应的 Lsit 集合,再迭代这个 List 就可以获取其对应的文件。


    下面是一个实例:

    /**
    * 文件上传
    * <p>
    * 先遍历名字,在根据名字遍历对应的文件,两层循环,ok!
    *
    * @param request 接受提交文件的 request
    * @return 返回上传的文件的保存路径
    */
    public static List<String> fileUpload(MultipartHttpServletRequest request) throws IOException {
    List<String> paths = new ArrayList<>();
    // String path = FileUpDownloadUtils.class.getClassLoader().getResource("UpDownLoad" + File.separator + "readme.txt").getPath();
    // 当前web应用的绝对路径
    // String path = request.getSession().getServletContext().getRealPath("/") + "UpDownLoad";
    // 获取系统的路径
    String path = File.separator + "UpDownLoad";
    Iterator<String> iterator = request.getFileNames(); while (iterator.hasNext()) {
    String fileName = iterator.next();
    List<MultipartFile> files = request.getFiles(fileName);
    if (files.size() > 0) {
    ListIterator<MultipartFile> multipartFileListIterator = files.listIterator();
    while (multipartFileListIterator.hasNext()) {
    String uuid = UUID.randomUUID().toString();
    String path_in = getPathByHashcode(path, uuid);
    MultipartFile multipartFile = multipartFileListIterator.next();
    StringBuilder builder = new StringBuilder();
    builder.append(path_in + File.separator);
    builder.append(uuid + "_");
    builder.append(multipartFile.getOriginalFilename());
    File file = new File(builder.toString());
    paths.add(file.getAbsolutePath());
    multipartFile.transferTo(file);
    }
    }
    }
    return paths;
    }

    再附送下代码中,我写的文件随机分配算法,这是其中的一种实现,只适合代码去读文件,人工找某个文件比较费劲,还有一种实现是按照日期分配;

    日期分配,方便人工去拿文件,但是存在弱点,如果一天之内,有人暴力上传文件,文件夹就会被撑爆。各有各的优缺点。

        /**
    * 文件分配算法,根据UUid的值 算出文件保存的地址 ;
    * <p>
    * UUID 的长度是固定的,然后根据其长度,保证其生成的 hascode 的长度也是一样长的(32位) ;
    * <p>
    * 每四位取为一个int 值 ,最多可以取 8 层 ;
    * <p>
    * 可以保存 16 * 16 * 16 * 16 * 1000 = 4 096 000(四百万份合同) ;
    *
    * @param path
    * @param uuid
    * @return
    */
    private static String getPathByHashcode(String path, String uuid) {
    int hashcode = uuid.hashCode();
    int one = hashcode & 0xf;
    int two = (hashcode >> 4) & 0xf;
    int three = (hashcode >> 4 >> 4) & 0xf;
    int four = (hashcode >> 4 >> 4 >> 4) & 0xf; File file = new File(path +
    File.separator + one + File.separator + two
    + File.separator + three + File.separator + four); if (!file.exists()) {
    file.mkdirs();
    } return file.getPath();
    }
  2. 下载文件

    导包都是导入 spring 框架下面的,不要导错了。做了下载文件的时候,对文件名的兼容性,可以有空格。

     /**
    * springMvc 的下载,原始的response的outputStream 怎么用的,都要忘记了 见鬼的框架,真香的封装
    *
    * @param imgPaths 封装需要下载的文件的路径
    * @return
    */
    public static ResponseEntity<Resource> fileDownload(String imgPaths, int blag) throws UnsupportedEncodingException { File file = new File(imgPaths);
    String simpleName = imgPaths.substring(imgPaths.indexOf("_") + 1); Resource body = new FileSystemResource(file);
    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
    .getRequestAttributes()).getRequest(); HttpStatus status = HttpStatus.CREATED; /**
    * 对文件名进行处理下
    */
    // 浏览器分为 火狐 和 非火狐
    if (request.getHeader("USER-AGENT").toLowerCase().indexOf("firefox") >= 0) {
    // 火狐头大,需要独特设置一下
    simpleName = new String(simpleName.getBytes("UTF-8"), "iso-8859-1");
    } else {
    simpleName = URLEncoder.encode(simpleName, "UTF-8");
    // IE 文件名有空格会被加号代替。需要自己替换回去
    simpleName = simpleName.replaceAll("\\+", "%20");
    } String suffix = simpleName.substring(simpleName.lastIndexOf(".") + 1);
    HttpHeaders headers = new HttpHeaders();
    switch (blag) {
    /**
    * 内嵌显示,针对IE浏览器:TEXT_PLAIN
    * 文件名有空格。火狐则会截断文件名,需要将文件名用字符串包起来.使用 springMvc 不再需要这样做,并且你做了,还会在文件名前后各加一个 _ ;
    *
    * 预览需要自己判断下文件类型。
    *
    */
    case SHOW:
    MediaType mediaType;
    switch (suffix.toLowerCase()) {
    case "png":
    case "jpg":
    case "gif":
    mediaType = MediaType.TEXT_PLAIN;
    break;
    // case "html":
    // case "xml":
    // case "markdown":
    // mediaType = MediaType.valueOf("text/" + suffix);
    // break;
    default:
    mediaType = MediaType.valueOf("application/" + suffix); }
    headers.setContentType(mediaType);
    break;
    /**
    * 下载,下载设置内容格式为二进制数据:MediaType.APPLICATION_OCTET_STREAM
    */
    case DOWNLOAD:
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.setContentDispositionFormData("attachment", simpleName);
    break;
    } headers.setContentLength(file.length());
    return new ResponseEntity<>(body, headers, status);
    }

    其中的常量是:

    传入 0 ,就只是显示在浏览器上,不下载,这个只显示功能还有点问题,图片、pdf等格式会显示,一些其他格式无论怎么调试都是会下载。。。 ; 1 是下载。

      public static final int SHOW = 0;
    public static final int DOWNLOAD = 1;

(十二)springMvc 处理图片,视频等文件的上传的更多相关文章

  1. 在SpringMVC框架下实现文件的 上传和 下载

    在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...

  2. SpringMVC+SwfUpload进行多文件同时上传

    由于最近项目需要做一个多文件同时上传的功能,所以好好的看了一下各种上传工具,感觉uploadify和SwfUpload的功能都比较强大,并且使用起来也很方便.SWFUpload是一个flash和js相 ...

  3. SpringMVC + AJAX 实现多文件异步上传

    转自:https://www.jianshu.com/p/f3987f0f471f 今天,我就这个问题来写一篇如何用 SpringMVC + AJAX 实现的多文件异步上传功能.基本的代码还是沿用上篇 ...

  4. 视频大文件分片上传(使用webuploader插件)

    背景 公司做网盘系统,一直在调用图片服务器的接口上传图片,以前写的,以为简单改一改就可以用 最初要求 php 上传多种视频格式,支持大文件,并可以封面截图,时长统计 问题 1.上传到阿里云服务器,13 ...

  5. SpringMVC学习09(文件的上传和下载)

    文件上传和下载 准备工作 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况 ...

  6. 文件正在上传的转圈圈gif图片引出的fixed定位和absolute定位

     文件正在上传的转圈圈gif图片  一.文件上传时,未上传返回成功状态之前给个gif动态图片显示在页面,改善用户体验. <!--S 遮罩层 --> <div id="mas ...

  7. SpringMVC听课笔记(十二:文件的上传)

    1.Spring MVC为文件上传提供了直接的支持,这种支持是通过即插即用的MultipartResolver实现的.Spring用Jakarta Commons FileUpload技术实现了一个M ...

  8. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——S ...

  9. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

随机推荐

  1. Android原生编解码接口 MediaCodec 之——踩坑

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/gb702250823/article/d ...

  2. 2019.6.24 校内测试 NOIP模拟 Day 2 分析+题解

    看到Day 2的题真的想打死zay了,忒难了QwQ~ T1 江城唱晚 这明显是个求方案数的计数问题,一般的套路是DP和组合数学. 正如题目中所说,这个题是一个 math 题.      ----zay ...

  3. Oracle JDBC 连接池

    1.简介 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据 ...

  4. Linux 配置eth0网卡

    缘由: 最近要复习docker,电脑没有centos7,于是下载了一个最新版的centos7,迫于强迫症没有eth0网卡,为了将ens33改为eth0于是寻求方法. 1.编辑网卡的配置文件 vi /e ...

  5. js常用时间转换函数

    1.秒转换为时分秒 // 秒转换为时分秒 export function secExchangeMoment(value = 0){ let secondTime = parseInt(value); ...

  6. 网络编程三要素之IP

    用来标示我们计算机在互联网上的唯一性 每个设备在网络中的唯一标识 每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址. ipconfig:查看本机IP192.168.12.4 ...

  7. C++ STL partial_sort_copy greater

    #include <iostream>#include <deque>#include <algorithm>#include <vector>#inc ...

  8. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_18-异常处理-不可预知异常处理

    框架抛出来的或者一些第三方的组件抛出来的异常.我们根本不知道它所对应的错误代码的信息,所以我们也没有办法给用户返回具体的错误代码和错误信息. 我们先在Map中定义有一些不可预知的异常,定义错误代码和错 ...

  9. nginx rewrite正则子组最多匹配到$9

    nginx rewrite正则匹配()匹配子组最多匹配到$9,就是从$0到$9 当需要匹配更多子组时,可通过变量来实现 if ($uri ~ ^/forum-15/sortid-74/(.*?)(la ...

  10. windows下初安装xgboost

    1.先检查一下自己的版本,如图python3.6,win64 我的之前环境是已经安装了anaconda. 2.去相关的网站下载 3.把下载的文件拷到此目录下(同pip在一个目录下) 4.cmd在此目录 ...