SpringBoot文件上传下载实例

博主博客
在实际的企业开发中,文件上传是比较常见的功能之一.而SpringBoot没有自己的文件上传技术,是依赖于SpringMVC的文件上传技术.在SpringBoot中集成了SpringMVC常用的功能,当然也包含了文件上传的功能,实现起来没有太多的区别.接下来我们通过示例展示下文件上传在Springboot项目中的实现.

1. 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";
    }

2.springboot实现多文件上传

方式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";
    }
}

3.springboot实现文件下载

/**
     * 实现文件下载
     *
     * @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";
    }

4. 拓展:

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接口,并提供一些用来处理请求文件的方法。

你可能感兴趣的:(spring,spring,boot,java)