• Spring MVC的文件上传


    1.文件上传

    文件上传是项目开发中常用的功能。为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这种情况下,浏览器才会把用户选择的文件二进制数据发送给服务器。

    Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。Spring MVC使用Apache Commons fileupload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver.所以Spring MVC的文件上传依赖Apache Commons fileupload的组件。

    2.MultipartFile

    Spring MVC会将上传文件绑定到MultipartFile对象中,该对象提供了获取上传文件内容,文件名等方法。通过transferTo()方法还可以将文件存储到硬件中。

    MultipartFile常用方法如下:

    *bye[] getBytes()  :获取文件数据

    *String getContentType()  :获取文件MIME类型

    *InputStream getIputStream()  :获取文件流

    *String getName()  :获取表单中文件组件的名字

    *String getOriginalFilename()  :获取上传文件的原名

    *boolean isEmpty()  :是否有上传的文件

    *void transferTo(File dest)  :将文件保存到一个目标文件中

    3.实例

    3.1创建一个项目,导入相应的jar包,包括Apache的Commons FileUpload的jar包

    3.2编写web.xml和springmvc-config.xml

        <!-- 配置前端控制器 -->
      <servlet>
          <servlet-name>springmvc</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>classpath:springmvc-config.xml</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>springmvc</servlet-name>
          <url-pattern>/</url-pattern>
      </servlet-mapping>
    <!-- spring可以自动去扫描base-package下面的包或者子包下面的java类 如果扫描到有spring相关注解的类,则吧这个类注册为spring的bean -->
        <context:component-scan base-package="com.dj.controller" />
        <!-- 配置MultipartResolver -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!-- 上传文件大小限制,单位为字节-10Mb -->
            <property name="maxUploadSize">
                <value>10485760</value>
            </property>
            <!-- 请求的编码格式 -->
            <property name="defaultEncoding">
                <value>UTF-8</value>
            </property>
        </bean>
        <!-- 默认装配 -->
        <mvc:annotation-driven></mvc:annotation-driven>
        <!-- 视图解析器 -->
        <bean id="viewResolver"
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 前缀 -->
            <property name="prefix">
                <value>/</value>
            </property>
            <!-- 后缀 -->
            <property name="suffix">
                <value>.jsp</value>
            </property>
        </bean>

    3.3编写一个上传文件的实体类

    private String username;
        //对应上传文件的file,类型为multipartfile,上传文件会自动绑定到image属性中
    private MultipartFile image;

    3.3编写controller

    @Controller
    public class FileUploadController {
    
        /**
         * 动态跳转页面
         * @param pagename
         * @return
         */
        @RequestMapping(value="/{pagename}")
        public String toPage(@PathVariable String pagename){
            return pagename;
        }
        
        @RequestMapping(value="regist")
        public String regist(HttpServletRequest request,
                @ModelAttribute User user,Model model) throws Exception, IOException{
            if(!user.getImage().isEmpty()){
                //文件上传路径
                String path = request.getServletContext().getRealPath("/images/");
                //上传文件名
                String filename = user.getImage().getOriginalFilename();
                File filepath = new File(path, filename);
                //判断路径是否存在
                if(!filepath.getParentFile().exists()){
                    filepath.getParentFile().mkdirs();
                }
                //将上传文件保存到一个目标文件中
                user.getImage().transferTo(new File(path+File.separator+filename));
                model.addAttribute("user", user);
                return "userinfo";
            }
                    return "error";
            
        }
    }

    3.4编写注册页面和显示信息页面

    <form action="regist" method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="username"/><br>
        请上传头像:<input type="file" name="image"><br>
        <input type="submit" vaue="注册">
    </form>
    <a href="download?filename=${requestScope.user.image.originalFilename }">
            ${requestScope.user.image.originalFilename }
        </a>

    3.5测试

    在浏览器中输入如下地址

    http://localhost:8888/FileUploadTest/registPage

     点击提交,可以看到

    这个文件的保存位置在你工作空间.metadata.pluginsorg.eclipse.wst.server.core的一个tmp下的wtpwebappsFileUploadTestimages这个目录下

    你可以在控制台打印保存文件路径位置再根据路径去本地找

     

     想看到文件具体位置可以把上传文件位置改为

    user.getImage().transferTo(new File("D:\"+filename));

    这时候就可以在d盘下面看到上传的文件

     源码下载地址:https://files.cnblogs.com/files/dj-blog/FileUploadTest.zip

     接下来我们再看文件下载:http://www.cnblogs.com/dj-blog/p/7535340.html

     

  • 相关阅读:
    ActiveMQ的用途
    HTTP 状态码的完整列表
    Linux中脚本运行错误(坏的解释器:没有那个文件或目录)
    Linux下ping: unknown host www.baidu.com的解决办法
    python中的collection
    Table里嵌套ASPXGridView
    致2015
    WPF学习之Binding(二)
    WPF学习之Binding(一)
    WPF UI布局(Layout)
  • 原文地址:https://www.cnblogs.com/dj-blog/p/7535101.html
Copyright © 2020-2023  润新知