4

前言

前后端交互除了数据类型之外,还会出现文件流的传输
比如压缩包,图片等待
在Spring中使用MultipartResolver接口来进行文件的交互
这里我以springboot为基础,用五步操作带大家简单完成文件流传输

第一步:POM

废话不多说,直接引入包依赖:

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

第二步:Config配置

在springmvc配置类中:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter

注入CommonsMultipartResolver:

@Bean(name = "multipartResolver")
    public MultipartResolver multipartResolver() throws IOException {
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setDefaultEncoding("UTF-8");
        resolver.setMaxInMemorySize(10240);     //最大内存大小 (10240)
        resolver.setMaxUploadSize(50*1024*1024);    //上传文件大小(单位为字节) 50M     50*1024*1024
        return resolver;
    }

这里有一个注意点
(name = "multipartResolver")不能漏,因为springIOC本身存在multipartResolver
我们需要覆盖它,如果没写,会拿不到前端传过来的文件流参数

当然使用springboot的还需要一个注意点,否则也会报错
在WarApplication启动类中,添加注解:

@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})

直接将spring自带的MultipartAutoConfiguration排除掉

第三步:后端API

这里我直接把Controller类贴出来,方便阅读:

@RestController
@RequestMapping("/")
public class StreamController {
    private static final Logger logger = LoggerFactory.getLogger(StreamController.class);
    @PostMapping("file")
    public R1 fileUpload(@RequestParam("myfile") MultipartFile myfile) throws IOException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String datefile = sdf.format(new Date());
        if (myfile.isEmpty()){
            return R1.error(500,"文件为空");
        }
        String fileName = myfile.getOriginalFilename();     //获取上传文件的原名
        logger.info(fileName+"文件已上传");
        String fileSuffix = fileName.substring(fileName.lastIndexOf("."));      //获取文件后缀名
        String newfileName = datefile+fileSuffix;
        String filePath = "D:\\CoolBlog\\back-end\\src\\main\\resources\\images\\";        //文件存储到本地的路径
        //String filePath = "//CoolBlog/back-end/src/main/resources/images/";        //文件存储到本地的路径
        File getFile = new File(filePath+newfileName);     //本地文件名加路径的File对象
        if (getFile.getParentFile().exists()){
            myfile.transferTo(getFile);     //把内存文件写到磁盘里
            return R1.success(200,"success");
        }
        return R1.error(500,"目标文件夹不存在");
    }
}

存到本地的文件用精确到秒的时间来命名,防止重复和中文报错

第四步:前端form提交

form的enctype和第一个input的name需要特别注意
这里很容易出错:

<form method="post" enctype="multipart/form-data" action="file">
    上传文件: <input type="file" name="myfile"><br/>
    <br/>
    传输: <input type="submit" value="Press"> 
</form>

第五步:操作演示

首先启动项目,进入html,添加需要上传的文件:

clipboard.png

接口操作成功:

clipboard.png

图片上传成功,并且重新命名:

clipboard.png

以上便是SSM上的文件流传输MultipartResolver
谢谢关注~记得点个赞再走哦


大叔一枝花
610 声望56 粉丝

Talk is cheap,show me the code