文件上传我们一般会有两种策略,一种是通过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目录下看到上传的文件。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!