zoukankan      html  css  js  c++  java
  • 构建web应用之——文件上传

    我们通过使用multipart请求数据接收和处理二进制信息(如文件)。DispatcherServlet并没有实现任何解析multipart请求数据的功能,它将该任务委托给了Spring中的multipart解析器,

    通过MultipartResolver接口的实现,来解析multipart请求中的内容。

    Spring3.1开始,Spring内置了两个MultipartResolver实现供我们选择:

    1.CommonMultipartResolver

    2.StandardServletMultipartResolver(推荐使用,由于使用Servlet所提供的功能支持,并不需要依赖任何其他的项目)

    下面是具体实现过程:

    一、配置multipart解析器

    在Spring应用上下文中,我们现将StandardServletMultipartResolver声明为bean:

    <!-- Multipart解析器配置 -->
        <bean id="multipartResolver"
              class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>

    除此而外,我们还需要为StandardServletMultipartResolver设置相关参数。需要注意的是,StandardServletMultipartResolver无法直接通过property标签来设置(StandardServletMultipartResolver

    没有构造参数,也没有要设置的属性),要设置相关参数,最简单的方法就是在web.xml配置中添加MultipartConfigElement:

    <!-- multipart解析器参数配置 -->
            <multipart-config>
                <!--<location>/tmp/upload</location>-->
                <max-file-size>2097152</max-file-size>
                <max-request-size>4194304</max-request-size>
            </multipart-config>

    location配置了文件上传过程中所写入的临时路径(个人感觉和MultipartFile.transferTo()方法所造成的结果类似)

    max-file-size规定了上传文件的大小(不超过2MB)

    max-request-size规定了整个请求的大小(不超过4MB)

    二、创建文件上传请求表单

    配置好Multipart解析器后,我们需要一个简单的文件上传表单作为我们的前端视图:

    <div>
            upload file:
            <form action="http://localhost:8080/trymaven/upload" method="post" enctype="multipart/form-data">
                file: <input type="file" name="fileName"/>
                <input type="submit" value="submit"/>
            </form>
        </div>

    需要注意的是,我们在form标签中设置enctype属性的值为multipart/form-data,它将会告诉浏览器以multipart数据的形式提交表单,而不是以表单数据的形式进行提交。

    除此而外,我们需要将input标签中的type属性值设置为file,时期接收一个二进制数据。

    三、处理multipart请求

    这里我们创建了一个新的Controller类用于响应处理mulitpart请求:

    package example.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestPart;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.File;
    import java.io.IOException;
    
    @Controller
    public class UploadFileController {
    
        @Value("#{settings['filePath']}")
        private String filePath;
    
        @RequestMapping(value = "upload", method = RequestMethod.POST)
        public String uploadFile(@RequestPart("fileName") MultipartFile file) throws IOException {
            String path = filePath + new String(file.getOriginalFilename().getBytes(), "utf-8");
            file.transferTo(new File(path));
            return "uploadInfo";
        }
    
    }

    这里我们使用@RequestPart()注解指定MultipartFile类型的参数file接收请求中对应的part数据(这里也可以是byte,但是原始byte比较简单但是功能有限),

    MultipartFile.transferTo(File)用于将上传的文件临时写入路径。

    值得注意的是,这里我们将路径信息通过配置文件暴露在外面,用户可以通过修改配置文件修改临时路径

    配置文件内容:

    filePath=D:/任务/

    设置配置文件路径:

    <util:properties id="settings" location="classpath:file.properties" />

    通过@Value()注解将配置文件中的key对应值注入变量

    @Value("#{settings['filePath']}")
        private String filePath;

    settings为定义的id,['filePath']为配置文件中的key(若配置文件中路径有中文,要修改配置文件编码为utf-8,不然在运行项目时会出现路径映射问题)

    经过测试后发现文件路径配置写在applicationContext.xml和dispatcher-servlet.xml中都可以。

    四、运行项目

    运行项目后,上传文件以及结果如下:

    到指定临时目录下找到写入的文件:

  • 相关阅读:
    201006120100630
    2010080120100901
    20101120至20101220
    201155学习总结
    PublishReport.rss
    windowservice创建及部署
    提示要角色管理工具安装Microsoft .NET Framework 3.5
    部署SSIS包
    ETL及SSIS
    IbatisNet
  • 原文地址:https://www.cnblogs.com/znnby1997/p/10251153.html
Copyright © 2011-2022 走看看