博主博客
在实际的企业开发中,文件上传是比较常见的功能之一.而SpringBoot没有自己的文件上传技术,是依赖于SpringMVC的文件上传技术.在SpringBoot中集成了SpringMVC常用的功能,当然也包含了文件上传的功能,实现起来没有太多的区别.接下来我们通过示例展示下文件上传在Springboot项目中的实现.
文件上传三要素:post
方法, 多部分表单enctype="multipart/form-data"
,表单类型为type="file"
SpringBoot的默认上传文件的大小是2m 如果你上传的文件超过了2m就会出现错误。需要配置文件上传的最大的大小,文章后有参考配置
<form action="/test5" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile" value="请选择文件">
<input type="submit" value="提交">
form>
@RequestMapping("/test5")
@ResponseBody
public String test5(MultipartFile uploadFile) {
try {
if (uploadFile.isEmpty()) {
return "files is empty";
}
//获取文件名称
String filename = uploadFile.getOriginalFilename();
//获取文件后缀名
String suffixName = filename.substring(filename.lastIndexOf("."));
System.out.println("上传文件名为:" + filename + "后缀名为:" + suffixName);
//设置文件的储存路径,可以写在配置文件中,通过@Value注解获取
String filePath = "J:\\worksoft\\uploadFile\\";
String path = filePath + filename;
File file = new File(path);
//检查是否存在目录
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();//新建文件
}
//文件写入
uploadFile.transferTo(file);
return "success!!!";
} catch (IOException e) {
e.printStackTrace();
}
return "error";
}
方式1:
<form action="/test6" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile" value="请选择文件">
<input type="file" name="uploadFile" value="请选择文件">
<input type="submit" value="提交">
form>
@RequestMapping(value = "/uploadMultifile", method = RequestMethod.POST)
@ResponseBody
public Object uploadMultiFile(@RequestParam("uploadFile") MultipartFile[] fileUpload) {
//可以通过@VALUE注解从配置文件中获取出来
String fileDir="J:\\worksoft\\uploadFile\\";
try {
for (int i=0;i<fileUpload.length;i++){
//获取文件名
String fileName = fileUpload[i].getOriginalFilename();
//指定本地文件夹存储图片
File dir = new File(fileDir);
if (!dir.exists()) {
dir.mkdirs();
}
if (fileUpload[i]!=null){
File upload_file = new File(fileDir + fileName);
fileUpload[i].transferTo(upload_file);
}
}
return "success to upload";
} catch (Exception e) {
e.printStackTrace();
return "fail to upload";
}
}
方式2,原始方法下载
<form action="/test6" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile" value="请选择文件">
<input type="file" name="uploadFile" value="请选择文件">
<input type="submit" value="提交">
form>
/**
* 实现多文件上传
*
* @param
* @return
*/
@RequestMapping("/test6")
@ResponseBody
public String test6(HttpServletRequest request) {
//获取多文件
List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("uploadFile");
MultipartFile file = null;
BufferedOutputStream stream = null;
for (int i = 0; i < files.size(); i++) {
file = files.get(i);
//可以从配置文件中获取出来
String filePath = "J:\\worksoft\\uploadFile\\";
if (!file.isEmpty()) {
try {
byte[] bytes = file.getBytes();
stream=new BufferedOutputStream(new FileOutputStream(new File(filePath + file.getOriginalFilename())));
stream.write(bytes);
stream.close();
} catch (IOException e) {
stream=null;
e.printStackTrace();
return "the"+i+"file upload error";
}
}else {
return "the"+i+"file is empty";
}
}
return "success";
}
}
/**
* 实现文件下载
*
* @param
* @return
*/
@RequestMapping("/test7")
@ResponseBody
public String test7(HttpServletRequest request, HttpServletResponse response) {
String filename="wxr.jpg";//文件名,根据前台获取的
if (filename!=null){
//设置文件路径
File file = new File("J:\\worksoft\\uploadFile\\wxr.jpg");//需要拼接获取
if (file.exists()){
response.setContentType("application/force-download");//设置响应类型
response.addHeader("Content-Disposition","attachment;fileName="+filename);//设置附件形式,指定名称
//读写操作,可以封装为一个工具类
byte[] buffer = new byte[1024];
FileInputStream fis=null;
BufferedInputStream bis=null;
try {
fis=new FileInputStream(file);
bis= new BufferedInputStream(fis);
ServletOutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i!=-1){
os.write(buffer,0,i);
i=bis.read(buffer);
}
return "success";
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return "error";
}
1.MultipartFile一些常用的API
byte[] getBytes(): 获取文件数据;
String getContentType(): 获取文件MIME类型,如application/pdf、image/pdf等;
InputStream getInputStream(): 获取文件流;
String getOriginalFileName(): 获取上传文件的原名称;
long getSize(): 获取文件的字节大小,单位为byte;
boolean isEmpty(): 是否上传的文件是否为空;
void transferTo(File dest): 将上传的文件保存到目标文件中
2.对于文件上传的一些配置
# Template mode to be applied to templates. See also StandardTemplateModeHandlers.
spring.thymeleaf.mode=LEGACYHTML5
spring.http.multipart.enabled=true
spring.http.multipart.max-file-size=10MB //文件最大大小
spring.http.multipart.max-request-size=10MB
#文件上传目录(注意Linux和Windows上的目录结构不同)
#file.uploadFolder=/root/upload/
#特别要注意此位置
file.uploadFolder=E:/upload/
3.文件上传的一些解释
Spring通过对ServletAPI的HttpServletRequest接口进行扩展,使其能够很好地处理文件上传。扩展后的接口名为org.springframework.web.multipart.MultipartHttpServletRequest
interface MultipartHttpServletRequest extends HttpServletRequest{
public MultipartFile getFile(String name);
public Map getFileMap();
public Iterator getFileNames();
}
MultipartHttpServletRequest接口简单地扩展了默认的HttpServletRequest接口,并提供一些用来处理请求文件的方法。