Input表单上传文件

**

表单上传文件的三要素:

**

  1. method属性——表单提交方式.
          表单上传的方式必须为POST。
          由于get请求是把请求参数拼接在请求路径后面,没有独立的请求体,所以有大小限制;但是post请求有单独的请求体,所以没有大小限制。
  2. enctype属性.
          必须设置为:multipart/form-data.
  3. <input>标签.
          type属性必须指定为"file",必须有name属性

上传方式一:(传统的方式)

      传统的方式:通过request域对象来上传文件。

代码如下:

  1. 前端代码.
    必须包含三要素。
	<h3>传统方式上传文件</h3>
    <form action="${pageContext.request.contextPath}/file/fileUpLoad" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="upload"><br/>
        <input type="submit" value="上传">
    </form>
  1. 服务器端代码.
    基于SpringMVC框架进行。
@Controller
@RequestMapping("/file")
public class FileController {
    /**
     * 传统方式 上传文件
     * @param request
     * @return
     */
    @RequestMapping("/fileUpLoad1")
    public String fileUpLoad1(HttpServletRequest request)throws Exception{
        //获取上传位置的真实路径
        String realPath = request.getSession().getServletContext().getRealPath("/loadups/");
        System.out.println(realPath);
        //创建File对象,一会向该路径下上传文件
        File file = new File(realPath);
        //判断该目录是否存在
        if(!file.exists()){     //该文件夹不存在
            file.mkdirs();      //创建文件夹
        }
        // 创建磁盘文件项工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        // 解析request对象
        List<FileItem> items = fileUpload.parseRequest(request);
        for (FileItem item : items) {
            // 判断文件项是普通字段,还是上传的文件
            if(item.isFormField()){
                //普通字段项
            }else{  //文件项
                //获取文件名
                String fileName = item.getName();
                //把文件的名称唯一化,以防名称一致
                String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
                fileName = uuid+"_"+fileName;
                //上传文件
                item.write(new File(file,fileName));
                //删除临时文件
                item.delete();
            }
        }
        return "success";
    }
 }
  1. 传统方式完成,可以访问测试

上传方式二:(利用SpringMVC框架)

      SpringMVC方式:利用框架自己封装的 MultipartFile 对象来实现。该对象表示上传的文件,要求变量名称必须和表单file标签的name属性名称相同。
      代码如下:

  1. 前端代码.
    也是必须包含三要素.
	<h3>springmvc方式上传文件</h3>
    <form action="${pageContext.request.contextPath}/file/fileUpLoad" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="upload"><br/>
        <input type="submit" value="上传">
    </form>
  1. 服务器端代码
    基于SpringMVC框架
    注意:
          参数中的MultipartFile 对象的名字需要与表单中的name属性值一致,否则会上传失败
@Controller
@RequestMapping("/file")
public class FileController {
     /**
     * springmvc方式 上传文件
     * @param request
     * @param upload
     * @return
     * @throws Exception
     */
    @RequestMapping("/fileUpLoad")
    public String fileUpLoad(HttpServletRequest request, MultipartFile upload)throws Exception{
        //获取上传位置的真实路径
        String realPath = request.getSession().getServletContext().getRealPath("/loadups/");
        System.out.println(realPath);
        //创建File对象,一会向该路径下上传文件
        File file = new File(realPath);
        //判断该目录是否存在
        if(!file.exists()){         //文件夹不存在
            file.mkdirs();           //创建文件夹
        }
        
        //获取上传的文件名
        String fileName = upload.getOriginalFilename();
        
        //把文件的名称唯一化
        String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
        fileName = uuid+"_"+fileName;
        
        //上传文件
        upload.transferTo(new File(file,fileName));
        
        return "success";
    }
}
  1. 需要在SpringMVC配置文件中配置文件解析器对象
    要求:
          id名称必须是 multipartResolver ,其他的名称都不行
	<!-- 配置文件解析器对象,要求id名称必须是multipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--最大上传的大小-->
        <property name="maxUploadSize" value="10485760"/>
    </bean>
  1. 基于SpringMVC框架的方式完成,可以访问测试。

上传方式三:(将文件上传到不同的服务器)

使用前提:
      1、需要配置两个tomcat服务器模拟.
      2、如果在web.xml文件中配置了过滤器,则需要注意拦截的路径,否则会上传失败
具体步骤:
      1、打开tomcat的安装目录,打开conf–>web.xml文件。在图片所示位置配置红色标识的内容,把tomcat的只读关闭。
Input表单上传文件
      2、在pom.xml文件中导入需要的坐标

<dependency>
	<groupId>com.sun.jersey</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>

      3、在SpringMVC配置文件中配置文件解析器
            要求id名称必须是multipartResolver

	<!-- 配置文件解析器对象,要求id名称必须是multipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--最大上传的大小-->
        <property name="maxUploadSize" value="10485760"/>
    </bean>

      4、前端代码:
            注意三要素.

<form action="user/fileupload" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"/><br/>
<input type="submit" value="上传文件"/>
</form>

5、服务器端代码

/**
* SpringMVC跨服务器方式的文件上传
*
* @param request
* @return
* @throws Exception
*/
@RequestMapping(value="/fileupload")
public String fileupload3(MultipartFile upload) throws Exception {
	System.out.println("SpringMVC跨服务器方式的文件上传...");
	// 定义另一个服务器的请求路径
	String path = "http://localhost:9090/uploads/";
	// 获取到上传文件的名称
	String filename = upload.getOriginalFilename();
	String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
	// 把文件的名称唯一化
	filename = uuid+"_"+filename;
	// 向图片服务器上传文件
	
	// 创建客户端对象
	Client client = Client.create();
	// 连接图片服务器
	WebResource webResource = client.resource(path+filename);
	// 上传文件
	webResource.put(upload.getBytes());
	
	return "success";
}