【SpringMVC 3.X 总结】8. SpringMVC图片的上传
一、需求
用户注册时,需要上传图片(头像),这是该功能的背景
二、上传文件的Jar包
commons-fileupload-1.3.1
commons-io-2.4
三、前端
(1)上传
<form action="file/upload.action" method="post" enctype="multipart/form-data">
<label>用户名:</label><input type="text" name="name"><br>
<label>密码:</label><input type="password" name="pwd"><br>
<label>上传头像:</label><input type="file" name="file"><br>
<input type="submit">
</form>
需要注意的是,一定要写 enctype="multipart/form-data",否则springmvc就会解析失败。这个的作用就是将form表单的数据以二进制的方式传输。
配置SpringMVC.xml文件
<!-- 上传文件 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<!-- 最大内存大小 -->
<property name="maxInMemorySize" value="10240"/>
<!-- 最大文件大小,-1为不限制大小 -->
<property name="maxUploadSize" value="-1"/>
</bean>
首先,springmvc上传图片(文件)是通过MultipartResolver(Multipart解析器)处理的,对于MultipartResolver而言它只是一个接口,它有两个实现类。CommonsMultipartResolver和StandardServletMultipartResolver。我用的是前者,它可以在spring的各个版本使用,但是需要依赖第三方包才能实现,而后者不依赖第三方包,但是要求sping版本在3.1以上。
(2)显示
<img src="${basePath}${user.image}">用户名:${user.name}
四、后端
po和mapper我是利用****自动生成的,所以不再书写。需要注意的是:我将MultipartFile定义在实体类中。
public class User {
private Integer id;
private String name;
private String pwd;
private String image;
private MultipartFile file;
Controller
@Controller
@RequestMapping("/file")
public class UserController {
@Autowired
IUserService userService;
@RequestMapping("/upload")
public String upload(User user,HttpServletRequest request,Model model) throws Exception{
//保存数据库的路径
String sqlPath = null;
//定义文件保存的本地路径
String localPath="D:\\File\\";
//定义 文件名
String filename=null;
if(!user.getFile().isEmpty()){
//生成uuid作为文件名称
String uuid = UUID.randomUUID().toString().replaceAll("-","");
//获得文件类型(可以判断如果不是图片,禁止上传)
String contentType=user.getFile().getContentType();
//获得文件后缀名
String suffixName=contentType.substring(contentType.indexOf("/")+1);
//得到 文件名
filename=uuid+"."+suffixName;
//文件保存路径
user.getFile().transferTo(new File(localPath+filename));
}
//把图片的相对路径保存至数据库
sqlPath = "/images/"+filename;
user.setImage(sqlPath);
userService.addUser(user);
model.addAttribute("user", user);
return "MyJsp";
}
用户上传的图片保存在相应的服务器中(由于自己测试,设置了Apache的虚拟目录,所以讲图片保存在本地硬盘(D盘新建的File目录)下),在数据库中只保存图片的相对路径。
Apache虚拟目录的设置:
在Apache的server.xml 下的<host></host>标签中,添加即可:
<Context docBase="D:\File" path="/images" reloadable="false"/>
五、数据库设计
转载 https://blog.****.net/qq_33764491/article/details/77440180