zoukankan      html  css  js  c++  java
  • SpringMVC03_文件上传

    本教程源码请访问:tutorial_demo

    一、文件上传的前提

    form表单的enctype取值必须是:multipart/form-data(默认值:application/x-www-form-urlencode);

    method取值必须是post;

    提供一个文本选择域<input type="file" />

    接下来的案例我们借助commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:commons-fileupload和commons-io,我们在pom.xml中添加如下的坐标

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
    

    二、文件上传回顾

    2.1、编写上传文件的JSP页面

    <%-- 文件上传 --%>
    <form action="${pageContext.request.contextPath}/fileUpload" method="post" enctype="multipart/form-data">
        文件<input type="file" name="upload" /><br/>
        <button type="submit">上传</button>
    </form>
    

    2.2、编写控制器类

    package org.codeaction.controller;
    
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpServletRequest;
    import java.io.File;
    import java.util.List;
    import java.util.UUID;
    
    @Controller
    public class FileUploadController {
    	
        //使用fileupload组件完成文件上传
        @RequestMapping("/fileUpload")
        public String fileUpload(HttpServletRequest request) throws Exception {
            System.out.println("文件上传");
      
            //上传的位置
            String path = request.getSession().getServletContext().getRealPath("/uploads/");
            File file = new File(path);
    
            //判断,该路径是否存在
            if (!file.exists()) {
                //创建该文件夹
                file.mkdirs();
            }
    
            //解析request对象,获取上传文件项
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
    
            //解析request
            List<FileItem> items = upload.parseRequest(request);
    
            //遍历
            for (FileItem item : items) {
                //进行判断,当前item对象是否是上传文件项
                if (!item.isFormField()) {
                    //说明上传文件项
                    //获取上传文件的名称
                    String fileName = item.getName();
                    //把文件的名称设置唯一值,uuid
                    String uuid = UUID.randomUUID().toString().replace("-", "");
                    fileName = uuid + "_" + fileName;
                    //完成文件上传
                    item.write(new File(path + "\", fileName));
                    //删除临时文件
                    item.delete();
                }
            }
            return "success";
        }
    }
    

    三、SpringMVC实现文件上传

    3.1、配置文件解析器

    在springmvc.xml中添加下面的配置

    <!--配置文件解析器对象-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760" />
    </bean>
    

    3.2、编写上传文件的JSP页面

    <%-- SpringMVC文件上传 --%>
    <p>SpringMVC方式文件上传</p>
    <form action="${pageContext.request.contextPath}/fileUpload1" method="post" enctype="multipart/form-data">
        文件<input type="file" name="upload" /><br/>
        <button type="submit">上传</button>
    </form>
    

    3.3、编写控制器类

    在控制器类中添加如下的方法

    //SpringMVC实现文件上传
    @RequestMapping("/fileUpload1")
    public String fileUpload1(HttpServletRequest request, MultipartFile upload) throws IOException {
        System.out.println("springmvc文件上传...");
    
        //上传的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        //判断,该路径是否存在
        File file = new File(path);
        if(!file.exists()){
            //创建该文件夹
            file.mkdirs();
        }
    
        //说明上传文件项
        //获取上传文件的名称
        String filename = upload.getOriginalFilename();
        //把文件的名称设置唯一值,uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"_"+filename;
        //完成文件上传
        upload.transferTo(new File(path + "\", filename));
    
        return "success";
    }
    

    四、SpringMVC跨服务器文件上传

    在实际开发中,我们会有很多处理不同功能的服务器,例如:

    • 应用服务器,负责部署我们的应用;
    • 数据库服务器,运行我们的数据库;
    • 缓存和消息服务器,负责处理大并发访问的缓存和消息;
    • 文件服务器,负责存储用户上传文件的服务器。

    分服务器处理让服务器各司其职,提升项目的运行效率。

    4.1、创建一个图片服务器

    1. 使用Maven创建一个新的web工程,不需要写任何代码;
    2. 部署该web工程时,需要修改端口号,不要和上传文件工程的端口号重复,HTTP port:9090,JMX port:1090。

    4.2、编写跨服务器文件上传代码

    4.2.1、在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>
    

    这两个Jar包用来实现文件的上传操作。

    4.2.2、修改Tomcat配置

    修改Tomcat服务器conf下的web.xml,进行如下修改

    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <!-- 接受文件的目标服务器可以支持写入操作 -->
        <init-param>
            <param-name>readonly</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    

    4.2.3、编写控制器类

    在控制器类中添加如下的方法

    @RequestMapping("/fileUpload2")
    public String fileUpload2(MultipartFile upload) throws Exception {
        System.out.println("跨服务器文件上传...");
    
        // 定义上传文件服务器路径
        String path = "http://localhost:9090/fileuploadserver/uploads/";
    
        // 说明上传文件项
        // 获取上传文件的名称
        String filename = upload.getOriginalFilename();
        // 把文件的名称设置唯一值,uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"_"+filename;
    
        // 创建客户端的对象
        Client client = Client.create();
    
        // 和图片服务器进行连接
        WebResource webResource = client.resource(path + filename);
    
        // 上传文件
        webResource.put(upload.getBytes());
    
        return "success";
    }
    

    4.2.4、编写上传文件的JSP页面

    <%-- 跨服务器文件上传 --%>
    <p>跨服务器方式文件上传</p>
    <form action="${pageContext.request.contextPath}/fileUpload2" method="post" enctype="multipart/form-data">
        文件<input type="file" name="upload" /><br/>
        <button type="submit">上传</button>
    </form>
    

    4.2.5、启动项目测试

    启动图片服务器之后,一定要在图片服务器发布的目录下新建uploads目录,不然没办法上传。

  • 相关阅读:
    C++ 将对象写入文件 并读取
    IronPython fail to add reference to WebDriver.dll
    How to Capture and Decrypt Lync Server 2010 TLS Traffic Using Microsoft Tools
    .net code injection
    数学系学生应该知道的十个学术网站
    Difference Between Currency Swap and FX Swap
    Swift开源parser
    谈谈我对证券公司一些部门的理解(前、中、后台)[z]
    JDK8记FullGC时候Metaspace内存不会被垃圾回收
    JVM源码分析之JDK8下的僵尸(无法回收)类加载器[z]
  • 原文地址:https://www.cnblogs.com/codeaction/p/13170281.html
Copyright © 2011-2022 走看看