多种文件上传的方式

示例代码:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.Date;
import java.util.Iterator;

@RestController
@RequestMapping("/upload")
public class UploadController {

    /**
     * 第一种方式
     * 使用传统的流操作读写
     * postman:
     * POST http://localhost:9090/changyong/upload/fileUpload
     * Body选择form-data, 选择要上传的文件, 参数名为file
     *
     * @param file
     * @return
     * @throws IOException
     */
    @RequestMapping("fileUpload")
    public String fileUpload(@RequestParam("file") CommonsMultipartFile file) throws IOException {
        //用来检测程序运行时间
        long startTime = System.currentTimeMillis();
        System.out.println("fileName:" + file.getOriginalFilename());
        try {
            //目录不存在则创建
            String uploadPath = "D:/javatest/fileUpload/";
            File directory = new File(uploadPath);
            if (!directory.exists()) {
                directory.mkdirs();
            }
            //-------------------------- 主体内容 -----------------------
            //获取输出流
            OutputStream os = new FileOutputStream(uploadPath + new Date().getTime() + "-" + file.getOriginalFilename());
            //获取输入流 CommonsMultipartFile 中可以直接得到文件的流
            InputStream is = file.getInputStream();
            byte[] bts = new byte[1024];
            //一个一个字节的读取并写入
            while (is.read(bts) != -1) {
                os.write(bts);
            }
            os.flush();
            os.close();
            is.close();
            //-------------------------- 主体内容 -----------------------
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("采用流上传的方式的运行时间:" + (endTime - startTime) + "ms");
        return "success";
    }

    /**
     * 第二种方式
     * 采用file.transferTo 来保存上传的文件(推荐)
     * postman:
     * POST http://localhost:9090/changyong/upload/fileUpload2
     * Body选择form-data, 选择要上传的文件,参数名为file
     *
     * @param file
     * @return
     * @throws IOException
     */
    @RequestMapping("fileUpload2")
    public String fileUpload2(@RequestParam("file") CommonsMultipartFile file) throws IOException {
        long startTime = System.currentTimeMillis();
        System.out.println("fileName:" + file.getOriginalFilename());

        //目录不存在则创建
        String uploadPath = "D:/javatest/fileUpload2/";
        File directory = new File(uploadPath);
        if (!directory.exists()) {
            directory.mkdirs();
        }

        //-------------------------- 主体内容 -----------------------
        //文件路径
        String path = uploadPath + new Date().getTime() + "-" + file.getOriginalFilename();

        File newFile = new File(path);
        //通过CommonsMultipartFile的方法直接写文件(注意这个时候)
        file.transferTo(newFile);
        //-------------------------- 主体内容 -----------------------
        long endTime = System.currentTimeMillis();
        System.out.println("采用file.transferTo的运行时间:" + (endTime - startTime) + "ms");
        return "success";
    }

    /**
     * 第三种方式
     * 使用Spring MVC 提供的的类的方法上传文件
     * postman:
     * POST http://localhost:9090/changyong/upload/springUpload
     * Body选择form-data, 选择要上传的文件,参数名为file,其实这里不需要
     *
     * @param request
     * @return
     * @throws IllegalStateException
     * @throws IOException
     */
    @RequestMapping("springUpload")
    public String springUpload(HttpServletRequest request) throws IllegalStateException, IOException {
        long startTime = System.currentTimeMillis();
        //目录不存在则创建
        String uploadPath = "D:/javatest/springUpload/";
        File directory = new File(uploadPath);
        if (!directory.exists()) {
            directory.mkdirs();
        }
        //-------------------------- 主体内容 -----------------------
        //将当前上下文初始化给  CommonsMultipartResolver (多部分解析器)
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
            request.getSession().getServletContext());
        //检查form中是否有enctype="multipart/form-data"
        if (multipartResolver.isMultipart(request)) {
            //将request变成多部分request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            //获取multiRequest中所有的文件名
            Iterator iter = multiRequest.getFileNames();

            while (iter.hasNext()) {
                //一次遍历所有文件
                MultipartFile file = multiRequest.getFile(iter.next().toString()); //iter.next().toString()是请求的参数名
                if (file != null) {
                    String path = uploadPath + file.getOriginalFilename();
                    //上传
                    file.transferTo(new File(path));
                }
            }
        }
        //-------------------------- 主体内容 -----------------------
        long endTime = System.currentTimeMillis();
        System.out.println("Spring方法的运行时间:" + (endTime - startTime) + "ms");
        return "success";
    }
}

其中,使用springMVC原生上传文件方法,需要一些简单的配置:

1)额外添加commons-fileupload依赖

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

2)设置文件大小

/**
 * 使用spring MVC原生上传文件方法,需要一些简单的配置
 * 需要引入 commons-fileupload
 * @return
 */
@Bean
public CommonsMultipartResolver uploadCommonsMultipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setDefaultEncoding("utf-8");
    //文件大小最大值
    multipartResolver.setMaxUploadSize(10485760000L);
    //内存中的最大值
    multipartResolver.setMaxInMemorySize(40960);
    return multipartResolver;
}

 

posted @   残城碎梦  阅读(129)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示