工作中遇到使用SpringMvc的文件上传,记录一下以备今后使用。
首先需要在SpringMvc的配置文件中配置:
form标签中要加上一个属性:
<form enctype="multipart/form-data" ></form>
input标签里的name设成file。(有待验证)
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
默认地,表单数据会编码为 "application/x-www-form-urlencoded"。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值)。
然后,java代码是酱紫滴:
@RequestMapping(value = "/upload")
public String upload(HttpServletRequest request) {
// 将当前上下文初始化给 CommonsMutipartResolver (多部分解析器)
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
// 检查form中是否有enctype="multipart/form-data"
if (multipartResolver.isMultipart(request)) {
// 将request变成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 获取multiRequest 中所有的文件名
Iterator
iter = multiRequest.getFileNames();
while (iter.hasNext()) {
// 一次遍历所有文件
MultipartFile file = multiRequest.getFile(iter.next().toString());
String filename = file.getOriginalFilename(); // 文件名称
if(filename.length() != 0) {
String filePath = "C:/";
file.transferTo(new File(filePath));
}
}
}
}
会抛出IOException, IllegalStateException这两个异常,为了让大家看得方便就不使用try catch了。
--------------------------2017.1.19补充--------------------------------------
这个东西做多文件上传没问题,可是同时上传几个文件就需要几个input,现在怎么可能还放着一堆input让你传文件呢。。
更多的是使用js框架,如果使用js框架,只能传一个文件(最新项目中用了
DropzoneJS),app端更别提input框了。
不过在本猿在一通百度+查看接口文档后终于搞定了。
if (multipartResolver.isMultipart(request)) {
// 将request变成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
MultiValueMap<String, MultipartFile> m = multiRequest.getMultiFileMap();
if(m == null || m.size() == 0) {
return new HashMap<String, List<String>>();
}
Iterator iterator = m.entrySet().iterator();
// 一次遍历所有文件
Entry entry = (Entry) iterator.next();
List<MultipartFile> files = (List<MultipartFile>) entry.getValue();
for(MultipartFile f : files) {
String filename = f.getOriginalFilename(); // 文件名称
String prefix = filename.substring(filename.lastIndexOf(".")); // 文件后缀
String name = filename.substring(0,filename.lastIndexOf(".")); // 文件名
if(filename.length() != 0) {
accessoryName.add(filename);
filename = UUID.randomUUID() + version + prefix;
//此路径是将附件保存到指定ip下 放到外网 就能使用户访问到
String filePath = localPath + Constants.NACCESSORY_FILE + userId;
//如果没有路径,就创建路径
File uploadDir = new File(filePath);
if(!uploadDir.exists() && !uploadDir.isDirectory()){
uploadDir.mkdirs();
}
filePath = filePath + "/" + filename;
accessoryStr.add(Constants.NACCESSORY_FILE + userId + "/" + filename );
try {
f.transferTo(new File(filePath));
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
代码片是不是炸了,怎么都引用不出。。。