Spring boot 文件上传
文件上传主要分以下几个步骤:
(1)新建 maven java project;
(2)在 pom.xml 加入相应依赖;
(3)新建一个表单页面(这里使用 thymleaf);
(4)编写 controller;
(5)测试;
(6)对上传的文件做一些限制;
(7)多文件上传实现
(1)新建 maven java project
新建一个名称为 spring-boot-fileupload maven java 项目;
(2)在 pom.xml 加入相应依赖;
加入相应的 maven 依赖,具体看以下解释:
POM.XML
< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = " http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd " >
< modelVersion > 4.0.0 </ modelVersion >
< groupId > com.hpit </ groupId >
< artifactId > springboot03 </ artifactId >
< packaging > war </ packaging >
< version > 0.0.1-SNAPSHOT </ version >
< name > springboot03 Maven Webapp </ name >
< url > http://maven.apache.org </ url >
< properties >
< project.build.sourceEncoding > UTF-8 </ project.build.sourceEncoding >
</ properties >
<!-- spring boot 项目依赖 -->
< parent >
< groupId > org.springframework.boot </ groupId >
< artifactId > spring-boot-starter-parent </ artifactId >
< version > 1.4.0.RELEASE </ version >
</ parent >
< dependencies >
<!-- spring boot web支持: 1、web mvc; 2、restful; 3、jackjson支持; 4、aop ........ -->
< dependency >
< groupId > org.springframework.boot </ groupId >
< artifactId > spring-boot-starter-web </ artifactId >
</ dependency >
<!--spring boot 集成Junit依赖 -->
< dependency >
< groupId > org.springframework.boot </ groupId >
< artifactId > spring-boot-starter-test </ artifactId >
< scope > test </ scope >
</ dependency >
<!-- spring boot thymeleaf模板引擎支持 -->
< dependency >
< groupId > org.springframework.boot </ groupId >
< artifactId > spring-boot-starter-thymeleaf </ artifactId >
</ dependency >
<!-- spring boot 配置文件解析处理支持 -->
< dependency >
< groupId > org.springframework.boot </ groupId >
< artifactId > spring-boot-configuration-processor </ artifactId >
< optional > true </ optional >
</ dependency >
<!-- servlet 依赖. -->
< dependency >
< groupId > javax.servlet </ groupId >
< artifactId > javax.servlet-api </ artifactId >
< scope > provided </ scope >
</ dependency >
<!-- log4j日志输出 -->
< dependency >
< groupId > log4j </ groupId >
< artifactId > log4j </ artifactId >
< version > 1.2.17 </ version >
</ dependency >
<!-- JSTL支持 -->
< dependency >
< groupId > javax.servlet </ groupId >
< artifactId > jstl </ artifactId >
</ dependency >
<!-- tomcat 的支持. -->
< dependency >
< groupId > org.springframework.boot </ groupId >
< artifactId > spring-boot-starter-tomcat </ artifactId >
< scope > provided </ scope >
</ dependency >
< dependency >
< groupId > org.apache.tomcat.embed </ groupId >
< artifactId > tomcat-embed-jasper </ artifactId >
< scope > provided </ scope >
</ dependency >
</ dependencies >
< build >
< finalName > ${project.artifactId} </ finalName >
< directory > target </ directory >
< plugins >
< plugin >
< artifactId > maven-compiler-plugin </ artifactId >
< configuration >
< source > 1.8 </ source >
< target > 1.8 </ target >
</ configuration >
</ plugin >
</ plugins >
</ build >
</ project >
(3)新建一个表单页面(这里使用 thymleaf)
在 src/main/resouces 新建 templates(参照前面的章节,应该知道,templates 是 spring boot 存放模板文件的路径),在 templates 下新建一个 file.html:
<! DOCTYPE html>
< html >
< head >
< title > spring boot 文件上传 </ title >
</ head >
< body >
< form method = "POST" enctype = "multipart/form-data" action = "/upload" >
< p >
文件: < input type = "file" name = "file" />
</ p >
< p >
< input type = "submit" value = "上传" />
</ p >
</ form >
</ body >
</ html >
(4)编写 controller;
编写 controller 进行测试,这里主要实现两个方法:其一就是提供访问的/file 路径;其二就是提供 post 上传的/upload 方法,具体看代码实现:
com.hpit.springboot03.web.FileUploadController
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.log4j.Logger;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
/**
* TODO 文件上传控制器
*
*
*/
@Controller
public class FileUploadController {
private Logger logger = Logger. getLogger (getClass());
@RequestMapping (value = "/upload" , method = RequestMethod. GET )
public String file() {
logger .info( "跳转文件上传控制器" );
return "file" ;
}
/**
* TODO 文件上传控制器
*
* @param file
* @return
* @throws IOException
*/
@ResponseBody
@RequestMapping (value = "/upload" , method = RequestMethod. POST )
public String upload( @RequestParam ( "file" ) MultipartFile file ) throws IOException { // 文件上传
BufferedOutputStream outputStream = new BufferedOutputStream(
new FileOutputStream( new File( file .getOriginalFilename())));
logger .info( "文件名称:
" + file .getOriginalFilename());
outputStream .write( file .getBytes());
outputStream .flush();
outputStream .close();
return "文件上传成功" ;
}
}
(5)编写 App.java 然后测试
App.java 没什么代码,就是 Spring Boot 的启动配置,具体如下:
import javax.servlet.MultipartConfigElement;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ServletComponentScan // 开始servlet扫描
@ComponentScan (basePackages = { "com.hpit" })
public class App {
public static void main(String[] args ) throws Exception {
SpringApplication. run (App. class , args );
}
}
然后你就可以访问: http://127.0.0.1 /upload 进行测试了,文件上传的路径是在工程的跟路径下,请刷新查看,
其它的请查看代码中的注释进行自行思考。
6 )对上传的文件做一些限制;
对文件做一些限制是有必要的,在 App.java 进行编码配置:
在 App 主程序入口处添加如下配置:
import javax.servlet.MultipartConfigElement;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ServletComponentScan // 开始servlet扫描
@ComponentScan (basePackages = { "com.hpit" })
public class App {
public static void main(String[] args ) throws Exception {
SpringApplication. run (App. class , args );
}
// 配置文件上传
@Bean
public MultipartConfigElement multipartConfigFactory() {
MultipartConfigFactory configFactory = new MultipartConfigFactory();
configFactory .setMaxFileSize( "128MB" ); // KB MB 设置单个上传文件大小
configFactory .setMaxRequestSize( "1024MB" );
configFactory .setLocation( "/" ); // 设置文件上传路径
return configFactory .createMultipartConfig();
}
}
(7)多文件上传实现
多文件对于前段页面比较简单,具体代码实现:
在 src/main/resource 下面创建 multifile.html
<! DOCTYPE html>
< html >
< head >
< title > spring boot 多文件上传 </ title >
</ head >
< body >
< form method = "POST" enctype = "multipart/form-data" action = "/upload" >
< p >
文件1: < input type = "file" name = "file" />
文件2: < input type = "file" name = "file" />
文件3: < input type = "file" name = "file" />
</ p >
< p >
< input type = "submit" value = "上传" />
</ p >
</ form >
</ body >
</ html >
添加控制实现:com.hpit.springboot03.web.MultiFileUploadController
package com.hpit.springboot03.web;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
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.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
@Controller
public class MultiFileUploadController {
private Logger logger = Logger. getLogger (getClass());
@RequestMapping (value = "/multifileupload" , method = RequestMethod. GET )
public String multiFile() {
logger .info( "跳转多文件上传" );
return "multifile" ;
}
/**
* TODO 多文件上传控制器
*
* @param servletRequest
* @return
*/
@RequestMapping (value = "multifileupload" , method = RequestMethod. POST )
public @ResponseBody String upload(HttpServletRequest servletRequest ) {
List<MultipartFile> files = ((MultipartHttpServletRequest) servletRequest ).getFiles( "file" );
for (MultipartFile multipartFile : files ) {
try {
BufferedOutputStream outputStream = new BufferedOutputStream(
new FileOutputStream( new File( multipartFile .getOriginalFilename())));
outputStream .write( multipartFile .getBytes());
outputStream .flush();
outputStream .close();
} catch (FileNotFoundException e ) {
e .printStackTrace();
return "文件上传失败" ;
} catch (IOException e ) {
e .printStackTrace();
return "文件上传失败" ;
}
}
return "文件上传成功" ;
}
}
启动浏览器输入路径进行测试。
项目结构图