zoukankan      html  css  js  c++  java
  • SSM框架之SpringMVC(5)文件上传

    SpringMVC(5)文件上传

    1、实现文件上传的前期准备

    1.1、文件上传的必要前提

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

    B method 属性取值必须是 Post

    C 提供一个文件选择域

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

    1.2、文件上传的原理分析

    当 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														 协议的正文
    -----------------------------7de1a433602ac
    Content-Disposition: form-data; name="file";
    filename="C:UserszhyDesktopfileupload_demofile.txt"
    Content-Type: text/plain                                 协议的类型(MIME 类型)
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
    -----------------------------7de1a433602ac--
    

    1.3、借助第三方组件实现文件上传

    使用 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>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>
    

    2、SpringMVC实现文件上传

    2.1、不使用springMVC的文件上传方式

    1.导入文件的jar

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>
    

    2.编写文件上传的jsp页面

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

    3.编写controller控制器

    /**
     * 使用原始方法解析
     * @param request
     * @return
     * @throws Exception
     */
    @RequestMapping("/fileupload1")
    public String fileupload(HttpServletRequest request) throws Exception {
        System.out.println("开始上传...");
    
        //使用fileupload组件完成文件上传
        //上传位置
        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()){
                //true表示普通表单项
            }else {
                //false上传文件项
                //获取上传文件项名称
                String filename = item.getName();
                String uuid = UUID.randomUUID().toString().replace("-", "");
                filename = uuid+"-"+filename;
                //完成文件上传
                item.write(new File(path,filename));
                //删除临时文件
                item.delete();
            }
        }
        System.out.println("文件上传成功....");
    
        return "success";
    }
    

    2.2、springMVC传统方式实现文件上传

    1. SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的
      name属性名称相同。
    2. 代码如下

    jsp页面

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

    控制器代码:

    @RequestMapping("/fileupload2")
    public String fileupload2(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("springmvc开始上传...");
    
        //使用fileupload组件完成文件上传
        //上传位置
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        File file =new File(path);
        if (!file.exists()){
            file.mkdirs();
        }
    
        String filename = upload.getOriginalFilename();
    
        //false上传文件项
        //获取上传文件项名称
    
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"-"+filename;
        //完成文件上传
        upload.transferTo(new File(path,filename));
    
        System.out.println("文件上传成功....");
    
        return "success";
    }
    

    3、配置文件解析器对象

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

    2.3、SpringMVC跨服务器方式文件上传

    1。 分服务器的目的

    在实际开发中,我们会有很多处理不同功能的服务器。例如:
    应用服务器:负责部署我们的应用
    数据库服务器:运行我们的数据库
    缓存和消息服务器:负责处理大并发访问的缓存和消息
    文件服务器:负责存储用户上传文件的服务器。
    (注意:此处说的不是服务器集群)

    2 准备两个 tomcat 服务器,并创建一个用于存放图片的 web 工程

    ​ 注意:在开启第二个tomcat时要修改tomcat服务器所占用的端口如把8080改为9090,否则第二个tomcat服务器不能打开。

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

    文件位置: E:javaapache-tomcat-9.0.17confweb.xml

    跨服务器上传文件时要修改的webxml的配置、

    3.jsp

    <h3>跨服务器springMVC方式文件上传</h3>
    
    <form action="user/fileupload3" method="post" enctype="multipart/form-data">
        选择文件<input type="file" name="upload"><br>
        <input type="submit" value="上传">
    </form>
    

    4.实现文件上传控制器

    @RequestMapping("/fileupload3")
    public String fileupload3(MultipartFile upload) throws Exception {
        System.out.println("跨服务器springmvc开始上传...");
    
       //定义上传服务器路径
        String path = "http://localhost:9090/fileserver_war/uploads/";
    
        //false上传文件项
        //获取上传文件项名称
        String filename = upload.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"-"+filename;
        //完成文件上传,跨服务器
        Client client = Client.create();
    
        //连接图片服务器
        WebResource webResource = client.resource(path + filename);
    
        //上传文件
    
        webResource.put(upload.getBytes());
    
        System.out.println("文件上传成功....");
    
        return "success";
    }
    
  • 相关阅读:
    Changing Icon File Of Push Button At Runtime In Oracle Forms 6i
    Set Font Properties On Mouse Hover Of Push Button And Text Items At Run time In Oracle Forms
    Change An Item Property Using Set_Item_Property In Oracle Forms
    Calling / Running a report in Oracle forms 10g / 11g
    Change Or Set Report Object Property At Run Time In Oracle Forms Using Set_Report_Object_Property Command
    Refresh / Updating a form screen in Oracle D2k Forms 6i
    Know How And When To Use System.Message_Level To Control Messages In Oracle Forms
    Perform Cut Copy Paste Operations Using Cut_Region Copy_Region Paste_Region Commands In Oracle Forms
    CHECKBOX_CHECKED built-in in Oracle D2k Forms
    Limiting To Select Only 5 Check Boxes Out Of Ten In Oracle Forms
  • 原文地址:https://www.cnblogs.com/wf614/p/11673816.html
Copyright © 2011-2022 走看看