轻松实现Javaweb文件上传

目录:

一、准备——配置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();
}

  嗯,这样一来,从文件的上传到接收都搞定了。

猜你喜欢

转载自blog.csdn.net/qq_28379809/article/details/80018445