您的位置:首页 > 编程语言 > Java开发

SpringBoot文件上传

2017-01-22 17:29 399 查看
技术背景:

springboot+maven+restful服务

首先分成三部分:

1.引入maven依赖包,主要是io和upload两个依赖,上代码:

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.写一个配置bean,可以直接在application里面写,也可以自己新建一个bean来写:两种方法如下:

public class Application {

@Bean
public MultipartConfigElement multipartConfigElement(){
MultipartConfigFactory factory=new MultipartConfigFactory();
factory.setMaxFileSize("128KB");
factory.setMaxRequestSize("128KB");
return factory.createMultipartConfig();
}

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}


或者写在单独的类里面,注入spring容器中

import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.stereotype.Component;

import javax.servlet.MultipartConfigElement;

/**
* <p>ClassName:     UploadBean
* <p>Description:   TODO
* <p>Author         maqp
* <p>Version        V1.0
* <p>Date           2017/1/22
*/
@Component
public class UploadBean {
public MultipartConfigElement multipartConfigElement(){
MultipartConfigFactory factory=new MultipartConfigFactory();
factory.setMaxFileSize("128KB");
factory.setMaxRequestSize("128KB");
return factory.createMultipartConfig();
}
}


3.最后的重头戏,就是文件上传,这里提供两种上传方式:单文件上传和多文件上传

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartRequest;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
* <p>ClassName:     UploadController
* <p>Description:   TODO
* <p>Author         maqp
* <p>Version        V1.0
* <p>Date           2017/1/17
*/
@RestController
@RequestMapping("/api/upload")
public class UploadController {

//单文件上传
@RequestMapping(value = "/singleFile" ,method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)//@RequestParam(value = "key", required = true) String key,
public String singleFileUpload(@RequestParam("orderCode") String orderCode,@RequestParam(value = "fileName", required = true) String fileName,@RequestParam(value = "file", required = true) MultipartFile file){

if(!file.isEmpty()){
try {
File rootDirectory=new File("rootFile\\"+orderCode);
if (!rootDirectory.exists()){
rootDirectory.mkdirs();
}
File outFile=new File(rootDirectory,fileName+".pjg");
byte[] bytes=file.getBytes();
BufferedOutputStream outputStream=new BufferedOutputStream(new FileOutputStream(outFile));
outputStream.write(bytes);
outputStream.close();
return "upload successful the path is "+outFile.getPath();
} catch (IOException e) {
e.printStackTrace();
}

}
return "failed because "+fileName+"file is empty";

}

//多文件上传(也包含单文件)
@RequestMapping(value = "/multiFile",method = RequestMethod.POST)
@ResponseBody
public List<String>  multiFileUpload(MultipartRequest request, @RequestParam("orderCode") String orderCode) throws IllegalStateException,IOException {

List<MultipartFile> files = ((MultipartHttpServletRequest)request).getFiles("file");
//建立根类的文件夹
File rootDirectory=new File("rootFile\\"+orderCode);
if (!rootDirectory.exists()){
rootDirectory.mkdirs();
}

List<String> listAddress= new ArrayList<>();
for (int i =0; i< files.size(); ++i) {
MultipartFile file = files.get(i);
String name =  file.getOriginalFilename();

if (!file.isEmpty()) {
try {
byte[] bytes = file.getBytes();
File outFile=new File(rootDirectory,name + i);
BufferedOutputStream stream =
new BufferedOutputStream(new FileOutputStream(outFile));
listAddress.add(outFile.getPath());
stream.write(bytes);
stream.close();
} catch (Exception e) {
return null;
}
} else {
return null;
}
}
return listAddress;

}

}


最后用postman调用的成功结果如下:



下篇文章是在遇到到的bug:

Java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade 

cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest

以及提供的四种思路
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息