SpringMVC(六)文件上传

SpringMVC(六)文件上传

文件上传的必要前提

1、 form 表单的 enctype 取值必须是:multipart/form-data(默认值是:application/x-www-form-urlencoded)enctype:是表单请求正文的类型

2、method 属性取值必须是 Post3、 提供一个文件选择域<input type=”file” />

文件上传的原理分析

当 form 表单的 enctype 取值不是默认值后,request.getParameter()将失效。enctype=”application/x-www-form-urlencoded”时,form 表单的正文内容是:key=value&key=value&key=value当 form 表单的 enctype 取值为 Mutilpart/form-data 时,请求正文内容就变成:每一部分都是 MIME 类型描述的正文—————————–7de1a433602ac  分界符Content-Disposition: form-data; name="userName"  协议头aaa 协议的正文—————————–7de1a433602acContent-Disposition:  form-data;  name="file";filename="C:\Users\think\Desktop\fileupload_demofile\b.txt"Content-Type: text/plain 协议的类型(MIME  类型)bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb—————————–7de1a433602ac–

传统方式的上传,不借助工具类:

@Controller
@RequestMapping("/upload")
public class UploadHander {
   /**
    * 传统方式的文件上传
    * @param request
    * @return
    * @throws Exception
    */
   @RequestMapping("/up")
   public String upload(HttpServletRequest request) throws Exception {
       // 文件保存在服务器何处
       ServletContext sc = request.getSession().getServletContext();
       // 获取当前应用发布目录
       String basePath = sc.getRealPath("/uploads");
       // 创建一个二级目录
       String datePath = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
       File file = new File(basePath, datePath);
       // 判断目录是否存在
       if (!file.exists()) {
           file.mkdirs();
       }
       // 创建磁盘文件项工厂对象
       DiskFileItemFactory factory = new DiskFileItemFactory();
       // 创建文件上传的核心对象
       ServletFileUpload stf = new ServletFileUpload(factory);
       // 解析request中的请求正文
       List<FileItem> items = stf.parseRequest(request);
       // 遍历集合
       for (FileItem item : items) {
           // 判断当前item是不是文件
           if (item.isFormField()) {
               // 表示不是文件
               System.out.println(item.getFieldName());
           } else {
               // 表示是文件
               // 取出文件名
               String fileName = item.getName();
               // 随机化文件名
               String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
               fileName = uuid + "_" + fileName;
               // 写文件
               item.write(new File(file, fileName));
               item.delete();
           }
       }
       return "ok";
   }
}
<%--文件上传1--%>
<form action="upload/up" method="post" enctype="multipart/form-data">
   图片:<input name="uploadFile" type="file"/>
   <input type="submit" value="提交">
</form>

传统方式的上传,借助工具类:

使用 Commons-fileupload 组件实现文件上传,需要导入该组件相应的支撑 jar 包:Commons-fileupload 和commons-io。commons-io 不属于文件上传组件的开发 jar文件,但 Commons-fileupload 组件从 1.1 版本开始,它工作时需要 commons-io 包的支持。

<dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.3.1</version>
</dependency>
<%--文件上传2--%>
<form action="upload/up3" method="post" enctype="multipart/form-data">
   图片:<input name="uploadFile" type="file"/>
   <input type="submit" value="提交">
</form>
@Controller
@RequestMapping("/upload")
public class UploadHander3 {
   /**
    * springMVC的文件上传
    * @param uploadFile
    * @param request
    * @return
    * @throws Exception
    */
   @RequestMapping("/up3")
   public String upload(MultipartFile uploadFile, HttpServletRequest request) throws Exception {
       // 文件保存在哪里
       ServletContext context = request.getSession().getServletContext();
       String realPath = context.getRealPath("/uploads");
       // 创建二级目录
       String path = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
       // 判断是否存在文件夹
       File file = new File(realPath, path);
       if (!file.exists()) {
           file.mkdirs();
       }
       // 获取文件名
       String filename = uploadFile.getOriginalFilename();
       // 给文件名加上随机数
       String name = UUID.randomUUID().toString().replace("-", "").toUpperCase();
       filename = name + "_" + filename;
       uploadFile.transferTo(new File(file, filename));
       return "ok";
   }

}
配置文件解析器
<!--
SpringMVC.xml
配置文件上传解析器
-->
<!-- id 的值是固定的-->
<bean id="multipartResolver"
     class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
   <!-- 设置上传文件的最大尺寸为 5MB -->
   <property name="maxUploadSize">
       <value>5242880</value>
   </property>
</bean>
跨服务器上传

在文件服务器的 tomcat 配置中加入,允许读写操作。文件位置:

conf->web.xml

<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
导入 jersey
<!--跨服务器上传文件所依赖的包-->
<dependency>
   <groupId>jersey-core</groupId>
   <artifactId>jersey-core</artifactId>
   <version>1.18.1</version>
</dependency>
<dependency>
   <groupId>com.sun.jersey</groupId>
   <artifactId>jersey-client</artifactId>
   <version>1.18.1</version>
</dependency>
@Controller
@RequestMapping("/upload")
public class UploadHander4 {

   // 图片服务器的地址
   private static final String SERVER_PATH = "http://localhost:9090/upload/uploads/";

   /**
    * springMVC的跨服务器文件上传
    *
    * @param uploadFile
    * @param request
    * @return
    * @throws Exception
    */
   @RequestMapping("/up3")
   public String upload(MultipartFile uploadFile, HttpServletRequest request) throws Exception {
       // 获取文件名
       String filename = uploadFile.getOriginalFilename();
       // 给文件名加上随机数
       String name = UUID.randomUUID().toString().replace("-", "").toUpperCase();
       filename = name + "_" + filename;
       // 创建客户端对象,用于跟图片服务器连接
       Client client = Client.create();
       // 建立连接
       WebResource resource = client.resource(SERVER_PATH + filename);
       // 发送请求:PUT POST
       String s = resource.put(String.class, uploadFile.getBytes());
       return "ok";
   }

}
<%--文件上传3--%>
<form action="upload/up3" method="post" enctype="multipart/form-data">
   图片:<input name="uploadFile" type="file"/>
   <input type="submit" value="提交">
</form>


发表评论