首页 > 代码库 > SpringMVC使用MultipartFile文件上传,多文件上传,带参数上传

SpringMVC使用MultipartFile文件上传,多文件上传,带参数上传

一、配置SpringMVC
在spring.xml中配置:
  1. <!-- springmvc文件上传需要配置的节点-->
  2. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  3. <property name="maxUploadSize" value="-1"/>
  4. <property name="defaultEncoding" value="UTF-8"/>
  5. <property name="resolveLazily" value="false"/>
  6. <property name="uploadTempDir" value="/statics/document/tempdir"/>
  7. <!--<property name="maxInMemorySize" value="http://www.mamicode.com/104857600"/>-->
  8. </bean>
其中属性详解:
defaultEncoding="UTF-8" 是请求的编码格式,默认为iso-8859-1
maxUploadSize="-1 是上传文件的大小,单位为字节 -1表示无限制
uploadTempDir="fileUpload/temp" 为上传文件的临时路径


二、单文件与多文件上传
1、单文件上传
jsp:
  1. <body>
  2. <h2>文件上传实例</h2>
  3. <form action="fileUpload.html" method="post" enctype="multipart/form-data">
  4. 选择文件:<input type="file" name="file">
  5. <input type="submit" value="提交">
  6. </form>
  7. </body>
注意要在form标签中加上enctype="multipart/form-data"表示该表单是要处理文件的!

controller:
  1. @RequestMapping("fileUpload")
  2. public String fileUpload(@RequestParam(value = "file", required = false) MultipartFile file) {
  3. // 判断文件是否为空
  4. if (!file.isEmpty()) {
  5. try {
  6. // 文件保存路径
  7. String filePath = request.getSession().getServletContext().getRealPath("/") + "upload/"
  8. + file.getOriginalFilename();
  9. // 转存文件
  10. file.transferTo(new File(filePath));
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. // 重定向
  16. return "redirect:/list.html";
  17. }

注意RequestParam参数中value的名字要与jsp中的相互匹配,否则会找不到返回空指针
transferTo是存储文件的核心方法,但是这个方法同一个文件只能使用一次,不能使用第二次,否则tomcat服务器会报500的错误

MultipartFile类常用的一些方法:
 
  1. String getContentType()//获取文件MIME类型
  2. InputStream getInputStream()//后去文件流
  3. String getName() //获取表单中文件组件的名字
  4. String getOriginalFilename() //获取上传文件的原名
  5. long getSize()  //获取文件的字节大小,单位byte
  6. boolean isEmpty() //是否为空
  7. void transferTo(File dest)//保存到一个目标文件中。


三、多文件上传
与上面的相同只不过是form里面多创建几个input
如果需要使用一个标签控件上传多个文件,需要使用js插件uploadify

jsp:
  1. <body>
  2. <h2>上传多个文件 实例</h2>
  3. <form action="filesUpload.html" method="post"
  4. enctype="multipart/form-data">
  5. <p>
  6. 选择文件:<input type="file" name="files">
  7. <p>
  8. 选择文件:<input type="file" name="files">
  9. <p>
  10. 选择文件:<input type="file" name="files">
  11. <p>
  12. <input type="submit" value="提交">
  13. </form>
  14. </body>

controller:
  1. private boolean saveFile(MultipartFile file) {
  2. // 判断文件是否为空
  3. if (!file.isEmpty()) {
  4. try {
  5. // 文件保存路径
  6. String filePath = request.getSession().getServletContext().getRealPath("/") + "upload/"
  7. + file.getOriginalFilename();
  8. // 转存文件
  9. file.transferTo(new File(filePath));
  10. return true;
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. return false;
  16. }
  17. @RequestMapping("filesUpload")
  18. public String filesUpload(@RequestParam("files") MultipartFile[] files) {
  19. //判断file数组不能为空并且长度大于0
  20. if(files!=null&&files.length>0){
  21. //循环获取file数组中得文件
  22. for(int i = 0;i<files.length;i++){
  23. MultipartFile file = files[i];
  24. //保存文件
  25. saveFile(file);
  26. }
  27. }
  28. // 重定向
  29. return "redirect:/list.html";
  30. }


四、带参数上传
还是使用form表单进行上传,但是上传文件的时候要带上一部分的参数
例子form上传使用多个input上传多个文件并且携带参数
jsp:
其中使用了ajaxForm插件,并没有展示出来
  1. <form method="post" enctype="multipart/form-data" id="uploadForm"
  2. action="${pageContext.request.contextPath}/background/worksInsert">
  3. 作品名称:<input type="text" name="name" id="name"><br>
  4. 参赛年份:<input type="text" name="year" id="year"><br>
  5. 参加竞赛:<select name="competition" id="competition">
  6. <option value="请选择">请选择</option>
  7. </select><br>
  8. 源文件上传:<input type="file" name="file1" id="file1"><br>
  9. 展示文件上传:<input type="file" name="file2" id="file2"><br>
  10. 附件上传:<input type="file" name="file3" id="file3"><br>
  11. <input type="submit" value="提交">
  12. </form>

controller:
主要是参数的书写,通过不同的value取到不同得文件,同时request.getParameter方法取到参数的值
  1. @RequestMapping("/worksInsert")
  2. @ResponseBody
  3. public MessageCarrier worksInsert(@RequestParam(value = "file1", required = false) MultipartFile file1, @RequestParam(value = "file2", required = false) MultipartFile file2, @RequestParam(value = "file3", required = false) MultipartFile file3, HttpServletRequest request) throws IOException {
  4. MessageCarrier messageCarrier = new MessageCarrier();
  5. if (file1 == null || request.getParameter("name") == null) {
  6. return null;
  7. }
  8. // 获取源文件存储路径
  9. String filename = request.getParameter("name");
  10. String sworks = savePathL("works") + "/" + filename;
  11. String vworks = savePathL("works") + "/" + filename;
  12. String fworks = savePathL("works") + "/" + filename;
  13. String sRealworks = System.getProperty("studentSystem.root") + sworks.substring(1, sworks.length());
  14. String sRealvworks = System.getProperty("studentSystem.root") + vworks.substring(1, vworks.length());
  15. String sRealfworks = System.getProperty("studentSystem.root") + fworks.substring(1, fworks.length());
  16. DBWorks dbWorks = new DBWorks();
  17. CompetitionWorks competitionWorks = new CompetitionWorks();
  18. // System.out.println(request.getParameter("name"));
  19. competitionWorks.setWorksName(request.getParameter("name"));
  20. competitionWorks.setWorksYear(request.getParameter("year"));
  21. competitionWorks.setWorksComID(request.getParameter("competition"));
  22. competitionWorks.setWorksIsIndex("0");
  23. competitionWorks.setWorksNeedUpdate("0");
  24. competitionWorks.setWorksSavePath(sworks + "/" + file1.getOriginalFilename());
  25. // 如果有展示文件获取展示文件的存储路径
  26. if (file2 != null && file2.getSize() != 0) {
  27. competitionWorks.setWorksSaveViewPath(vworks + "/" + file2.getOriginalFilename());
  28. } else {
  29. competitionWorks.setWorksSaveViewPath("NULL");
  30. }
  31. // 如果有附件的话获取附件的存储路径并保存
  32. if (file3 != null && file3.getSize() != 0) {
  33. competitionWorks.setWorksSaveFilePath(fworks + "/" + file3.getOriginalFilename());
  34. } else {
  35. competitionWorks.setWorksSaveFilePath("NULL");
  36. }
  37. //先将内容设置为NULL
  38. competitionWorks.setWorksContent("NULL");
  39. messageCarrier = dbWorks.worksInsert(competitionWorks);
  40. switch (messageCarrier.getMessageContent()) {
  41. case "OK": {
  42. FilesUpload filesUpload = new FilesUpload();
  43. messageCarrier = filesUpload.upload(file1, sRealworks);
  44. if (!competitionWorks.getWorksSaveViewPath().equals("NULL")) {
  45. messageCarrier = filesUpload.upload(file2, sRealvworks);
  46. }
  47. if (!competitionWorks.getWorksSaveFilePath().equals("NULL")) {
  48. messageCarrier = filesUpload.upload(file3, sRealfworks);
  49. }
  50. //如果上传成功则解析内容并将其录入数据库
  51. if (messageCarrier.getMessageContent().equals("OK")) {
  52. String path = competitionWorks.getWorksSavePath();
  53. String filePath = System.getProperty("studentSystem.root") + path;
  54. String fileName = path.substring(path.lastIndexOf("/") + 1);
  55. File file = new File(filePath);
  56. //解析文件内容
  57. FilesToContent filesToContent = new FilesToContent();
  58. String content = filesToContent.resolve(file);
  59. // System.out.println(content);
  60. competitionWorks.setWorksContent(content);
  61. messageCarrier = dbWorks.worksUpdateName(competitionWorks);
  62. }
  63. }
  64. break;
  65. default: {
  66. return messageCarrier;
  67. }
  68. }
  69. return messageCarrier;
  70. }






http://fromwiz.com/share/s/3cTmX51TMQ-b2QTact03UPg83ItAml2XO4wJ23yjLa2bEKE1 

SpringMVC使用MultipartFile文件上传,多文件上传,带参数上传