SpringBoot文件上传

来源:互联网 发布:js json数据格式转换 编辑:程序博客网 时间:2024/05/01 09:21

技术背景:

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 */@Componentpublic 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

以及提供的四种思路


0 0
原创粉丝点击