首先学习MultipartFile这个类他 extends InputStreamSource 这个类 ;
我们自己写一实现MultipartFile这个类,会发现有这几个功能,获取文件的类型、大小、文件名、判断是否为空…
package com.warehouse.util; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.io.InputStream; /** * @Author 侯国威 * @邮箱 1045077189@qq.com * @data 2021/9/6 21:56 */ public class MultipartFileTest implements MultipartFile { // 获取文件名 @Override public String getName() { return null; } // 获取原始名称 @Override public String getOriginalFilename() { return null; } // 获取类型 @Override public String getContentType() { return null; } // 是否是空的 @Override public boolean isEmpty() { return false; } // 获取文件大小 @Override public long getSize() { return 0; } @Override public byte[] getBytes() throws IOException { return new byte[0]; } // 获取输入流 @Override public InputStream getInputStream() throws IOException { return null; } // 写入文件 这里往往是写入的文件路径 @Override public void transferTo(File file) throws IOException, IllegalStateException { } }
具体怎么使用呢 应用场景 spring springmvc mysql
从视图解析->controller控制层接收到前端的视图->然后再到Service接口下的Impl业务处理层,在这里我们将业务逻辑写入到controller中。
接下来如下
1、controller层
MultipartFile (file) 括号里面的字符串名称必须和前端传来的name相同,否则获取不到文件信息,
@RequestMapping("/add") @ResponseBody public ReturnData addFileInputPage(FileManage fileManage, MultipartFile file, HttpServletRequest request) throws IOException { // 这里是获取到session中的用户信息 TableUser tableUser = (TableUser) session.getAttribute(Consts.SYS_USER_INFO); // 路径 String realPath = request.getSession().getServletContext().getRealPath("/upload/file"); // 原始名称 String oldName = file.getOriginalFilename(); // 文件类型 String fileType = file.getContentType(); // 文件大小 int size = (int) (file.getSize() / 1024.0 / 1024.0 * 100); // 除以100还原 保留了2位小数 String fileSize = (size / 100.0) + "M"; fileManage.setFilePath(realPath); fileManage.setFileType(fileType); fileManage.setOldName(oldName); fileManage.setFileSize(fileSize); fileManage.setUploadTime(new Date()); fileManage.setUserId(tableUser.getId()); file.transferTo(new File(realPath)); return fileManageService.insertSelective(fileManage);
2、service层
大家可以注意到 我这里为什么是ReturenData?而不是String实际上我是将这个ReturnData 让他继承HashMap<String, Object> 并且进行封装,返回的数据是Map,主要是与异步交互使用。他如果i>0则返回sueess()这个方法。
@Override public ReturnData insertSelective(FileManage record) { int i = fileManageMapper.insertSelective(record); return UpdateOrInsertResultDeal.dealWith(i); }
提示:以下是本篇文章正文内容,下面案例可供参考
<div class="layui-input-inline layui-show-xs-block"> <button type="button" class="layui-btn" data-type="import" id="importData"><i class="layui-icon"></i>上传文件 </div> upload.render({ elem: "#importData",//导入id 这里的ID就是 上面的button的ID url: modleName + "/add", // 地址 accept: "file", 文件的形式 exts: 'xls|xlsx|xlsm|xlt|txt|jpg|png', 这里可以继续延申比如 PDF、text、docx等 contentType: false, /** * 必须false才会避开jQuery对 formdata 的默认处理 * XMLHttpRequest会对 formdata 进行正确的处理 */ processData: false, before: function (obj) { layer.msg('文件上传中...', { icon: 16, shade: 0.01, time: 0 }) }, done: function (res) { //关闭上传提示窗口 if (res.code === 200) { layer.msg('导入成功', {icon: 1, shade: 0.4, time: 1500}); tableIns.reload(); } else { layer.msg('导入失败', {icon: 1, shade: 0.4, time: 1500}); } } });
插入成功的状态
代码如下(示例):
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.7</version> </dependency>
提示:这里对文章进行总结:
其实很简单,特别注意下如果说有什么不会的,希望大家去参阅官方的文档,我这里主要是layui-UI的API
以及java SE文档
需要源码的小伙私信,请打击多多专注!!!!!!