我整理了一下,这个办法在Servlet上应该也用得上。其实文件上传主要的问题是在于存储路径的拼接。
这里我是把东西存在Web项目的WebContent目录下的
下面贴一些代码
目标应该是这样一个格式 Workspace\ProjectName\自定义目录\fileName
于是就有下面三段代码
然后直接拼接起来就行了。下面我直接贴代码吧
首先是jsp的form部分
<form action="upload" encType="multipart/form-data" method="post"> <label>选择文件</label> <input id="fileId" name="file" type="file"/> <input type="submit" value="提交"/> </form>
然后是Controller部分
@RequestMapping("/upload") public String uploadImg(HttpServletRequest request) throws IllegalStateException, IOException { //拼接文件存储的目录 String temp=Thread.currentThread().getContextClassLoader().getResource("").getPath(); int num=temp.indexOf(".metadata"); String path=temp.substring(1,num).replace('/', '\\')+request.getContextPath().replaceAll("/", "")+"\\WebContent\\images\\"; //上传文件 List<String> list = FileUtil.upLoad(request, path); request.setAttribute("path", list.get(0)); System.out.println(list.get(0)); return "uploadok"; }
最后是我在FileUtil里封装的一个办法,其实我很纠结要不要单文件、多文件分开来。最后我使用List来返回存储的路径,后面可能会根据需要改
package com.yck.util; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.commons.CommonsMultipartResolver; public class FileUtil { public static List<String> upLoad(HttpServletRequest request,String path) { List<String> list = new ArrayList<String> (); //存放结果 //1、将当前上下文初始化给CommonMutipartResolver CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); //2、检查Form中encType是否为multipart/form-data if(multipartResolver.isMultipart(request)) { //将request转为MultipartHttpServletRequest MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; //获取迭代器遍历multipartRequest里的文件名 Iterator<String> iter = multipartRequest.getFileNames(); while(iter.hasNext()) { //获取文件并向下遍历 MultipartFile file = multipartRequest.getFile(iter.next().toString()); if(file != null) { //获取文件类型,即后缀名 String str = file.getOriginalFilename(); String suffix = str.substring(str.lastIndexOf(".")); //用 当前日期+UUID作为文件名避免重名 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); String dateStr = sdf.format(new Date()).replaceAll("-", ""); String name = dateStr +UUID.randomUUID().toString().replaceAll("-", ""); //拼接文件绝对路径 String filePath = path + name + suffix; try { file.transferTo(new File(filePath)); } catch (IllegalStateException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } list.add(filePath); } } } return list; } }
最后测试结果
控制台输出的路径也是符合预期的
E:\ckck\EclipseOxygen\MyWeb\WebContent\images\59fd10b473d4463686e1bffeaca5c46c.jpg