之前想做一个更换用户头像的功能,需要用到文件上传,在网上学习的时候踩了许多坑,最后总结出来成功的方法记录一下
说是SSM的文件上传功能,其实是基于SpringMVC的文件上传功能
此外还有传统的文件上传,跨服务器的文件上传,留待后续实践。
1.添加依赖,或者jar包
我是基于maven的项目,所以就直接添加依赖了
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
2.再springmvc配置文件中配置文件解析器
<!-- 定义文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设定默认编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 设定文件上传的最大值为5MB,5*1024*1024 -->
<property name="maxUploadSize" value="5242880"></property>
</bean>
文件解析器的id是固定的,不要随意改变,此外还有一些属性可以配置,这里没有写出来,需要的可以自己再配
3.jsp中创建表单
<form enctype="multipart/form-data" method="post" id="upload">
<input type="file" name="uploadFile" id="uploadFile"/>
<input type="button" id="btn" value="上传"/>
</form>
要上传文件,表单的enctype必须为multipart/form-data,method为post
4.写jq
$("#btn").click(function(){
var formdata=new FormData();
formdata.append("uploadFile",$('#uploadFile')[0].files[0])
console.log(formdata.get("uploadFile"));
$.ajax({
url:"testUpImage",
data:formdata,
type:"post",
dataType:"json",
processData:false,
contentType:false,
success:function(json){
if(json.code==100){
alert("上传成功");
}else{
alert(json.code);
}
},
error:function(){
alert("上传出错");
}
})
})
5.controller
这个picname是自定义的文件名字,需要的话在jsp中加个input框就好
@RequestMapping(value="/testUpImage",method=RequestMethod.POST)
@ResponseBody
public Msg testUpImage(String picname,
MultipartFile uploadFile,
HttpServletRequest request) throws Exception {
// 定义文件名
String fileName = "";
// 1. 获取原始文件名
String uploadFileName = uploadFile.getOriginalFilename();
// 2. 截取文件扩展名
String extendName = uploadFileName.substring(
uploadFileName.lastIndexOf(".") + 1
);
// 3. 把文件加上随机数,方式文件重复
String uuid = UUID.randomUUID().toString()
.replace("-", "")
.toUpperCase();
// 4. 判断是否输入了文件名
if(!StringUtils.isEmpty(picname)) {
fileName = uuid + "_" + picname + "." + extendName;
} else {
fileName = uuid + "_" + uploadFileName;
}
System.out.println(fileName);
// 获取文件路径
ServletContext context = request.getServletContext();
String basePath = context.getRealPath("/uploads");
// 解决同一文件夹中文件过多问题
String datePath = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
// 判断路径是否存在: 发布的路径,并不是工作空间的路径!
String realPath = basePath + "/" + datePath;
System.out.println("真实路径:" + realPath);
File file = new File(realPath);
if(!file.exists()) {
file.mkdirs();
}
// 使用MultipartFile接口中的方法,把上传的文件写到指定位置
uploadFile.transferTo(new File(file, fileName));
System.out.println(file+fileName);
return Msg.success();
}
6.查看是否上传成功
我在控制台输出了文件路径
D:\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\kygl\uploads\2020-02-2106021E9730E64433B7201C8559EEE0C7_plane.png
找到文件夹看看
文件上传成功了