前言
前后端交互除了数据类型之外,还会出现文件流的传输
比如压缩包,图片等待
在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,添加需要上传的文件:
接口操作成功:
图片上传成功,并且重新命名:
以上便是SSM上的文件流传输MultipartResolver
谢谢关注~记得点个赞再走哦
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。