看过之前的蜕变系列文章,相信你对springMVC有了一定的认识。对springMVC的异常处理,也有了一定的认识。今天我们来开启新讨论,讲一讲web开发中会经常遇到的一个功能,文件上传。

猿蜕变同样是一个原创系列文章,帮助你从一个普通的小白,开始掌握一些行业内通用的框架技术知识以及锻炼你对系统设计能力的提升,完成属于你的蜕变,更多精彩内容,还是私信我吧,黑机构太多,老是举报我,大号都被封号了(由此可见对这些黑机构的伤害有多深)。

文件上传这种小事情,我们自然不用担心啦。SpringMVC提供了强有力的支持,不会让你退化到使用request的inputStram的老路上去哒。一般来说,使用commons组件就轻松搞定啦。

我们在讲文件上传文件的功能之前,先做一点准备工作啦,我们先在webapp目录下创建一个名为upload的文件夹用于存放上传的文件。

然后,再编写一个文件上传的表单页面upload.jsp文件,增加一个表单即可。

<%@ page language="java" contentType="text/html;charset=utf-8"pageEncoding="utf-8"isELIgnored="false"%>
<!DOCTYPE html >
<html>
<head>
<title>Spring MVC 文件上传样例</title>
</head>
<body><form action="upload.do" enctype="multipart/form-data"method=post id="picForm"><lable>请选择需要上传的文件:</lable><input type="file"name="pic" id=""pic""/><br /><input type="submit"value="提交" id="submit"/><br /></form>
</body>

注意:上传文件的表单需要在from标签中加入属性enctype="multipart/form-data",没有这个等待你的必然是,一顿操作猛如虎,抬头一看原地杵。

</html>显示上传文件的页面showUpload.jsp
<%@ page language="java" contentType="text/html;charset=utf-8"pageEncoding="utf-8"isELIgnored="false"%>
<!DOCTYPE html >
<html>
<head>
<title>Spring MVC 文件上传样例</title></head>
<body><img src="${path}"/>
</body>
</html>

编写Controller代码

package com.pz.web.study.springmvc.controller;import java.io.File;import javax.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;@Controller
public class UploadFileControllerDemo {@RequestMapping("/upload.do")public String upload(MultipartFilepic,HttpServletRequest req,Model model) throws Exception {if(!pic.isEmpty()) {//获取服务器上传的文件路径String path =req.getServletContext().getRealPath("/upload");//获取文件名称String filename =pic.getOriginalFilename();//限制文件上传的类型if ("image/png".equals(pic.getContentType())||"image/jpeg".equals(pic.getContentType())||"image/jpg".equals(pic.getContentType())) {File file = new File(path, filename);//完成文件上传pic.transferTo(file);model.addAttribute("path", "/upload"+"/"+filename);return"showUpload";}}return"../upload";}}

Spring MVC提供了MultipartFile类型来接收文件类型的参数,MultipartFile是一个接口,提供了一些操作文件的方法:

getOriginalFilename() 获取上传文件的文件名

isEmpty() 用于判断是否有文件上传,如果有文件上传返回true

getContentType() 获取上传文件类型
transferTo(File file) 将文件上传写入磁盘。

getName() 获取表单中input标签里的name属性值。

getBytes() 以byte数组的形式返回上传文件。

getInputStream() 返回上传文件的InputStram对象。

req.getServletContext().getRealPath("/upload")用于获取上传文件被存放的目录,其中getRealPath中的路径相对于应用的webapp目录算起的,不要搞错了噢。

修改pom.xml引入commons相关依赖:

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><artifactId>commons-fileupload</artifactId><groupId>commons-fileupload</groupId><version>1.3.3</version></dependency></dependencies>

修改spring-servlet.xml增加配置

<bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--设置字符编码防止文件名乱码--><property name="defaultEncoding"value="utf-8"/><!--设置上传文件的总大小,单位是字节b--><property name="maxUploadSize"value="2048576"/><!--设置内存缓冲区的大小,当超过该值的时候会写入到临时目录--><property name="maxInMemorySize"value="2048576"/><!--设置临时目录--><property name="uploadTempDir"value="temp"/><!--默认是false,如果设置为true的话,不会将文件路径去除--><property name="preserveFilename"value="false"/><!--是否使用懒加载,默认是false--><property name="resolveLazily"value="true"/>
</bean>

启动应用,访问http://127.0.0.1/upload.jsp。蘑菇头,赶紧选择一张好看的图片,上传吧。

当上传的文件文件超出配置时指定的大小,应用程序会抛出异常——MaxUploadSizeExceededException。我们之前已经学习过SpringMVC的相关异常处理了,这里就不再重复讲了。

上传多个文件与单个文件最主要的区别是在于,Controller中接收文件的参数类型为MultipartFile的数组,即MultipartFile[] 并且需要加上annotation——@RequestParam。上传多个文件的页面input标记要设置相同的name属性值。我们看下面这个例子:

编写用于上传的jsp页面 uploadMultiFile.jsp

<%@ page language="java" contentType="text/html;charset=utf-8"pageEncoding="utf-8"isELIgnored="false"%>
<!DOCTYPE html >
<html>
<head>
<title>Spring MVC 文件上传样例</title></head>
<body><form action="uploadMultiFile.do"enctype="multipart/form-data" method=post id="picForm"><lable>请选择需要上传的文件:</lable><input type="file"name="pics" id=""pic""/><br /><input type="file"name="pics" id=""pic""/><br /><input type="submit"value="提交" id="submit"/><br /></form>
</body>
</html>

编写Controller代码,在UploadFileControllerDemo中新增方法

   @RequestMapping("/uploadMultiFile.do")public String uploadMultiFile(@RequestParam("pics") MultipartFile[] pics, HttpServletRequest req,Model model) throws Exception {if (null != pics || pics.length < 2) {List<String> paths= new LinkedList<String>();for (MultipartFile pic : pics) {// 获取服务器上传的文件路径String path =req.getServletContext().getRealPath("/upload");// 获取文件名称String filename =pic.getOriginalFilename();// 限制文件上传的类型if ("image/png".equals(pic.getContentType())|| "image/jpeg".equals(pic.getContentType())|| "image/jpg".equals(pic.getContentType())) {File file = new File(path, filename);// 完成文件上传pic.transferTo(file);paths.add("/upload" + "/" +filename);}}model.addAttribute("paths", paths);return"showUploadMultiFile";}return"../uploadMultiFile";}

再次强调一下,@RequestParam("pics") MultipartFile[] 注意参数类型 和annotation的值,必须和页面input标记的name属性值匹配!

启动应用,访问http://127.0.0.1/uploadMultiFile.jsp,上传多个文件试试吧。

jsp文件上传_猿蜕变系列7——也说说springMVC上传姿势相关推荐

  1. jsp中的url拼接的参数传递到controller乱码_猿蜕变系列5——一文搞懂Controller的花式编写...

    看过之前的执行流程,相信你对springMVC有了一定的认识.今天我们继续来学习springMVC相关的核心知识,帮助你快速起飞,完成蜕变. 每月底工厂君会根据后台记录筛选转发文章前三位的朋友,给与奖 ...

  2. springboot上传文件同时传参数_Spring Boot 系列:使用 Spring Boot 上传文件

    上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个 Spring Boot 上传文件的小案例. 1.pom 包配置 我们使用 Spring Boot 版本 2. ...

  3. restful post请求_猿蜕变9——一文搞定SpringMVC的RESTFul套路

    看过之前的蜕变系列文章,相信你对springMVC有了一定的认识.对springMVC的Interceptor拦截器,也有了一定的认识.今天我们来开启新讨论,讲一讲springMVC对那一种休闲风的支 ...

  4. 普通类创建获取session 方式_猿蜕变11——一文搞懂mybatis花式使用方式

    看过之前的蜕变系列文章,相信你对mybatis有了初步的认识.但是这些还不够,我们今天进一步来了解下mybatis的一些用法. 猿蜕变同样是一个原创系列文章,帮助你从一个普通的小白,开始掌握一些行业内 ...

  5. jsp文件命名规范_代码规范整理

    我喜欢优雅和高效的代码.代码逻辑应当直截了当,叫缺陷难以隐藏:尽量减少依赖关系,使之便于维护:依据某种分层战略完善错误处理代码:性能调至最优,省的引诱别人做没规矩的优化,高出一对混乱来.整洁的代码只做 ...

  6. aws php 上传文件 限制大小_如何压缩PDF文件大小,满足各种上传大小要求

    介绍 今天我们来说一个小技巧,就是对PDF文件大小的压缩.那么这个问题是怎么来的呢,我们在系统上传PDF文件的时候,由于系统限制,PDF大小受到了限制,我们需要对PDF进行压缩小一点进行上传,才能满足 ...

  7. java文件客户端下载_使用Java写一个minio的客户端上传下载文件

    标签:color   ati   tty   java   system   wired   format   media   param 前言: 确保已经安装了minio的服务端 代码: pom.x ...

  8. python post上传大文件分片上传_基于七牛 用python实现分片上传 创建文件报错701...

    创建文件时出错: 701 Unknown {"error":"block 0: yonginvalid context"} 抓包结果: POST /mkfile ...

  9. html表ge模板_猿进化系列10——一文学会动态模板的套路

    看完上一个章节,相信你已经掌握了servlet相关技术的基础知识和用法,你也学习过java的一些基础知识了,今天我们就一起来掌握动态web页面的制作姿势. 猿进化是一个原创系列文章,帮助你从一只小白快 ...

最新文章

  1. 编写时钟aplet程序java,编写时钟 Applet 程序
  2. zzUbuntu安装配置Qt环境
  3. 线性代数 第四章 向量组的线性相关性
  4. linux git gui使用教程,跨平台最好用的Git GUI工具gitkraken
  5. c#计算 坐标点与坐标点之间的距离
  6. PyTorch系列入门到精通——梯度消失与爆炸,损失函数
  7. 排序算法第五篇——快速排序
  8. cf修改游戏客户端是什么意思_cf游戏客户端是什么
  9. 联通3G用户破千万 建成全球规模最大WCDMA网络
  10. 通过napalm-huawei-vrp模块对华为交换机信息进行分析(ENSP模拟器)
  11. 定了!这 35 所高校将设人工智能本科专业!
  12. PostgreSQL 数据离散性 与 索引扫描性能(btree and bitmap index scan)
  13. java 双三次线性插值_三种常见的图像处理双三次插值算法
  14. 【vue】浏览器播放提示音audio
  15. 如何在 Windows 10/11 下通过命令卸载产品许可密钥
  16. Model of an Electric Arc for Circuit Analysis(翻译)
  17. 花卉培育信息管理系统设计与实现
  18. 驱动开发之注册表:获取注册表HKEY_CURRENT_USER对应路径(SID)
  19. win10键锁定计算机,win10系统创建一键锁定计算机的快捷方式的操作方法
  20. 华为运营商级路由器配置示例 | 配置VPLS over TE示例(LDP方式)

热门文章

  1. matlab 高斯迭代代码_用Matlab编写你的第一个有限元_《数值计算与程序设计》系列课程...
  2. Android开发之高德地图定位成功返回的定位信息
  3. Swift调用第三方OC项目
  4. word万维计算机教程,计算机课件word文档.doc
  5. matlab火箭升空问题,困扰火箭的三大问题终于要解决了!球迷:我都要膨胀了!...
  6. 洛谷 P3853 [TJOI2007]路标设置
  7. instr 函数从后往前计数 instr(spell,' ',-1)
  8. 什么?你竟然还没有用这几个chrome插件?
  9. Javascript设计模式
  10. 【Linux】Linux服务器(centos7)环境搭建java/python3/nginx