1.需要的jar包
commons-fileupload.jar
知识内容在W3Cshool,链接:https://www.w3cschool.cn/spring_mvc_documentation_linesh_translation/spring_mvc_documentation_linesh_translation-pve827s5.html
2.首先配置MultipartResolver的xml
<!-- 配置文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 文件大小最大值 -->
<property name="maxUploadSize" value="10485760000" />
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="40960" />
</bean>
3.可以开始写java上传测试类了
package com.amayadream.webchat.utils;
import java.io.File;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.multipart.MultipartFile;
/**
*
* @ClassName: FileWriterTest
* @Description: MVC上传文件测试类
* @author shadow
* @date 2018年6月6日 下午2:00:00
*
*/
public class FileWriterTest {
/**
*
* @Title: saveFiles
* @Description: 保存多个文件
* @param @param files
* @param @return 设定文件
* @return boolean 返回类型
* @throws
*/
public boolean saveFiles(MultipartFile[] files,HttpServletRequest req) {
//定义文件存储位置
String path = req.getServletContext().getRealPath("/")+"upload"+"\\";
//定义一个MultipartFile对象
MultipartFile multipartFile;
//判断文件数组不为空且长度大于0
boolean flag = true;
if(files!=null&&files.length>0) {
//循环存储文件
for(int i=0;i<files.length;i++) {
//给MultipartFile对象赋予属性
multipartFile = files[i];
//保存文件
flag = saveFile(multipartFile, path,req);
}
}
return flag;
}
/**
*
* @Title: saveFile
* @Description: 保存单个文件
* @param @param file
* @param @param path
* @param @return 设定文件
* @return boolean 返回类型
* @throws
*/
public boolean saveFile(MultipartFile multipartFile,String path,HttpServletRequest req) {
//防止多线程下的创建文件出错
synchronized (this) {
//判断文件是否为空
if(!multipartFile.isEmpty()) {
try {
//创建用于转存数据的文件对象
File saveFile = new File(path);
/*例子1:
* 你想在E盘下创建A文件夹,再在A文件夹中创建B文件夹,但是你并不知道有没有A文件夹(没有A文件夹就更不会 在A文件夹下有B文件夹)
* 这种情况就需要进行目录判断(判断在E盘下是否存在A文件夹)
* File saveFile = new File(E:\\A\\B);
* if(!saveFile.exists()) { exists()方法判断该目录是否存在
saveFile.mkdirs(); mkdirs()创建多级目录
}
* 例子2:
* 你想在E盘下的A文件夹中创建B文件夹,在已有A文件夹的目录下创建B文件夹
* 同样进行目录判断(判断在A文件夹下是否存在B文件夹)
* File saveFile = new File(E:\\A\\B);
* if(!saveFile.exists()) { exists()方法判断该目录是否存在
* saveFile.mkdir(); mkdir()创建1级目录
* }
* */
//判断该文件对象(该文件夹是否存在)是否存在,不存在则创建该名称文件夹
if(!saveFile.exists()) {
saveFile.mkdirs();
}
//文件保存路径>>>>>>>>>>>>>>>>>getOriginalFilename()为获取客户端上通过HTTP传输过来文件的原始名称
String saveFilePath = path+multipartFile.getOriginalFilename();
//转存文件 >>>>>>>>>transferTo()将接收到的文件传输到指定的目标文件,如果目标文件已经存在,它将首先删除目标文件再传输到指定的目标文件(可以理解为覆盖同名)。
multipartFile.transferTo(new File(saveFilePath));
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
}
}
4.在controller中调用工具方法
package com.amayadream.webchat.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.amayadream.webchat.utils.FileWriterTest;
import com.amayadream.webchat.utils.Result;
/**
*
* @ClassName: AboutController
* @Description: TODO(这里用一句话描述这个类的作用)
* @author
* @date 2018年6月6日 下午3:00:12
* >>>>>>>>>>>>>>@RestController效果 为 @Controller + @ResponseBody的效果 给Controller加后 类里的方法都不会返回视图,返回的就是类返回的内容
*/
@RestController
@RequestMapping(value="file")
public class AboutController {
@RequestMapping(value="upload",method = RequestMethod.POST)
public Result saveFiles(@RequestParam("files") MultipartFile[] files,FileWriterTest fileWriter) {
boolean flag = fileWriter.saveFiles(files);
if(flag){
return new Result(Result.SUCCESS, "成功");
}else {
return new Result(Result.ERROR, "失败");
}
}
}
5.前端代码
<form action="${ctx}/file/upload" method="post" enctype="multipart/form-data">
<input type="file" id="" name="files"multiple>
<input type="file" id="" name="files"multiple>
<input type="file" id="" name="files"multiple>
<input type="submit" value="提交">
</form>
6结果
E盘中并不存在目录文件夹
点击提交后
小结:文件上传并不是很难,但是对于文件夹创建需要谨慎小心。