目录:
一、准备——配置jar包
maven pom.xml中配置:
<!-- file upload -->
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version
</dependency>
有关maven依赖包的配置可以参考:快速配置maven依赖包——pom.xml配置
二、文件上传——前端
前端很简单,一个<input type="file" />
即可。注意如果用原生的表单提交的话,应该写成这样:
<form enctype="multipart/form-data" method="POST">
<input type="file" name="myfile" />
</form>
三、文件上传——接收文件
后端接收文件有多种方式。
先来说明一个问题,用java中的Controller来处理HTTP请求的时候,携带的数据会被spring预处理,这里就有一个问题——request中无法直接获得file的信息,通过debug调试可以发现在如下代码中:
@RequestMapping(path="/uploadFile")
public ModelAndView uploadFile(HttpServletRequest request, HttpServletResponse response){
return new ModelAndView("index");
}
这里的request其实不是HTTPServletRequest类型,而是StandardMultipartHttpServletRequest类型(这里的继承关系比较复杂不予赘述),那么我们怎么获得文件呢?以两种方式举例:
1.强制转换request类型为它的实际类型:StandardMultipartHttpServletRequest
@ResponseMapping(path="uploadFile")
@ResponseBody
public Map<String,Object> uploadFile(StandardMultipartHttpServletRequest request){
Map<String,Object> map = new HashMap<String,Object>();
Iterator<String> iterator = request.getFileNames();
While(iterator.hasNext()){
MultipartFile file = request.getFile(iterator.next());
//下面开始保存file,或者进行一些其他的处理
}
return map;
}
2.利用spring自动装配获得文件
@RequestMapping(path="/uploadPicture",method= {RequestMethod.POST})
@ResponseBody
public Map<String,Object> uploadFile(@RequestParam("file")MultipartFile file,HttpServletRequest request){
Map<String,Object> map = new HashMap<String,Object>();
//参数中自动装配了文件file,此处直接处理这个file即可
return map;
}
注:第二种方法这里只写了获得单个文件,如果是多文件的话使用file数组即可。
四、文件上传——保存文件
这个也很简单,就使用普通的java写文件方式就行。
public String saveFile(File file) throws IOException{
String fileNames = file.getOriginalFilename();//获得file的文件名
int split = fileNames.lastIndexOf(".");
String suffix = fileNames.subString(spilit+1, fileNames.length());//文件后缀,即类型
byte[] bytes = file.getBytes();//以byte数组形式获得数据
File savedFile = new File(new Date()+"."+suffix);//要保存的文件,根据项目自定义
BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(savedFile));
stream.write(bytes);
stream.close();
return savedFile.getAbsolutePath();
}
嗯,这样一来,从文件的上传到接收都搞定了。