zoukankan      html  css  js  c++  java
  • SpringMVC中采用简洁的配置实现文件上传

    文件上传我们一般会有两种策略,一种是通过IO流上传,还有一种是通过表单上传,其实这两种在客户端实现起来都是很简单的,在服务端处理会略有差别,个人感觉IO上传代码简单,但是也有很多硬伤,还是表单上传更合适。特别是如果我们的后台程序如果既面向移动端,又面向Web前端,那么通过表单上传无疑是最佳解决方案。OK,废话不多说,我们来看看如何通过一个最简单的配置来实现文件的上传。 
    我们主要通过如下几个步骤来实现这个功能:

    1.引入依赖 
    2.创建文件上传页面 
    3.配置SpringMVC 
    4.Web配置 
    5.编写Controller

    OK,按照这个步骤我们一步一步来看。

    引入依赖

    当然在引入依赖之前我们需要先创建一个被Maven管理的Web Project,创建方式我就不多说了。创建成功之后在SpringMVC框架的基础之上再添加如下两个依赖就行了:

     <dependency>
                <groupId>commons-fileupload</groupId>
                <artifactId>commons-fileupload</artifactId>
                <version>1.3.2</version>
            </dependency>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.5</version>
     </dependency>

    两个依赖库,一个用来解决文件上传,一个简化IO操作。

    创建文件上传页面

    这个是一个简单的jsp页面,我在resources文件夹中创建views文件夹,在views文件夹中创建index.jsp文件。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>文件上传</title>
    </head>
    <body>
    <form action="upload" enctype="multipart/form-data" method="post">
        <input type="file" name="file" />
        <input type="submit" value="上传" />
    </form>
    </body>
    </html>

    这个页面很简单,没啥好说的,注意action是upload就行了。

    配置SpringMVC

    这一步算是比较关键的一步,但是这里只有一个新Bean,我们先来看看类:

    @Configuration
    @EnableWebMvc
    @ComponentScan("org.sang")
    public class MVCConfig extends WebMvcConfigurerAdapter{
        @Bean
        public InternalResourceViewResolver viewResolver() {
            InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
            viewResolver.setPrefix("/WEB-INF/classes/views/");
            viewResolver.setSuffix(".jsp");
            viewResolver.setViewClass(JstlView.class);
            return viewResolver;
        }
    
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/index").setViewName("/index");
        }
        @Bean
        public MultipartResolver multipartResolver() {
            CommonsMultipartResolver resolver = new CommonsMultipartResolver();
            resolver.setMaxUploadSize(1000000);
            return resolver;
        }
    }

    这个类在前面几篇博客中已经反复说过好几次了,这里只是多了一个multipartResolver方法,该方法用来提供一个MultipartResolver的Bean,该方法中主要根据业务需求对CommonsMultipartResolver进行配置,我这里以限制上传文件大小为例。

    Web配置

    public class WebInit implements WebApplicationInitializer {
        public void onStartup(ServletContext servletContext) throws ServletException {
            AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
            context.register(MVCConfig.class);
            context.setServletContext(servletContext);
            ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(context));
            servlet.addMapping("/");
            servlet.setLoadOnStartup(1);
        }
    }

    编写Controller

    @Controller
    public class UploadController {
        @ResponseBody
        @RequestMapping(value = "/upload",method = RequestMethod.POST,produces = "text/plain;charset=UTF-8")
        public String upload(MultipartFile file) {
            try {
                FileUtils.writeByteArrayToFile(new File("/home/sang/workspace/"+file.getOriginalFilename()),file.getBytes());
                return "上传成功";
            } catch (IOException e) {
                e.printStackTrace();
                return "上传失败";
            }
        }
    }

    这里通过Common-IO 中提供的相关方法,直接将上传文件的byte数组写成文件就行。 
    这个时候运行项目,在浏览器中打开index.jsp,如下: 


    这里写图片描述
    选择文件然后上传即可在电脑的/home/sang/workspace目录下看到上传的文件。

  • 相关阅读:
    mysql 时间戳 转 时间
    VSCode搭建VUE 开发环境
    虚拟通信
    JavaScript 获取客户端计算机硬件及系统信息
    Thinkphp关联模型BELONGS_TO
    docker部署rancher踩坑篇
    青龙面板 脚本 依赖库下载安装
    Linux 随记
    Tekton DAG代码
    手写Spring valar
  • 原文地址:https://www.cnblogs.com/franson-2016/p/6211914.html
Copyright © 2011-2022 走看看