很多刚毕业的小伙伴,在初学Java面向对编程时,往往因为某个方法不知道,或者说不会用,再或者根本不知道有这个方法时就会感到很困惑,从而失去编程语言的热度。这篇文章给大家分享我的学习文件导入导出时期遇到的问题。
一、整体思路
首先学习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});
}
}
});
三、实现效果
插入成功的状态
三、使用的库文件
1.引入库
代码如下(示例):
<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文档
需要源码的小伙私信,请打击多多专注!!!!!!