首先要明确一个点,文件上传的本质实际上是在项目当中定义了一个文件夹(没有的话就自动创建),将上传的附件之类的东西放在里头,将文件名和文件的路径存到数据当中,最后再通过前端的显示实现 上传、查看、下载。
那我们要做的工作包括:
1、分开文件名,拆分为文件名和后缀
2、定义文件流,它经历了 MultipartFile->File->FileItem
3、创建存放附件的文件夹
4、文件流传文件,文件名和文件的路径存数据库
来看看这样一个功能的文件上传是怎么做到的
对于第一张表格,我们在创建它的数据的时候呢,给它赋予了传附件的功能,
这边的前端是这样写的。
注意,此时表格form 必须加上 enctype="multipart/form-data",
这个属性表示多种类型的数据的传输,不仅仅是 传统的二进制的文本,还有 复杂的文件传输。
<div class =" layui-inline">
<label class="layui-form-label" id="public_Net_AttachTag">附件</label>
<div class="layui-input-inline" style="width: 500px;" id="public_Net_isAttach">
<input type="file" name="file" id="file"/>
</div>
</div>
然后后端获取它的id并分别存入文件和和存放文件名、文件路径
//可以留意传入的参数是mfile
@RequestMapping(value = "/create")
public @ResponseBody String create(@RequestParam(value = "file", required = false) CommonsMultipartFile mFile, YfNetInfo yfNetInfo,HttpServletRequest request) {
HashMap<String, String> keyMap=new HashMap<String, String>();
try {
//这边的输入是补全一些数据库数据创建必须的信息,如创建人、创建时间之类的,可以忽略
yfNetInfo.setId(UUIDUtil.getUUID());
yfNetInfo.setCompany(controller.currentCompany());
yfNetInfo.setCreateUser(controller.currentUser());
yfNetInfo.setCreateDateTime(DateTools.getFullNowDateTime());
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("strSn", yfNetInfo.getStrSn());
//文件相关的东西的初始的设置
String strFileName = "";
String strFilePath = "";
String contentUploadPath = "/static/NetInfoUpload";
String appPath = request.getSession().getServletContext().getRealPath(contentUploadPath);
String netInfoId = yfNetInfo.getId();
//上传附件到相关的记录当中
if (!mFile.isEmpty()) {
try {
if (!mFile.isEmpty()) {
String fid = UUIDUtil.getUUID();
FileItem fileItem = mFile.getFileItem();
File uploadFileDirct = new File(appPath, userName);
if (!uploadFileDirct.exists())
uploadFileDirct.mkdirs();
strFileName = fileItem.getName();
String suffixName = strFileName.substring(strFileName.lastIndexOf(".") + 1);
String fileName = strFileName.substring(0,strFileName.lastIndexOf(".")) + netInfoId.replace("-", "") + "." + suffixName;
File uploadFile = new File(uploadFileDirct, fileName);
strFilePath = contentUploadPath + "/" + userName + "/" + fileName;
fileItem.write(uploadFile);
YfNetInfoAttach yfNetInfoAttach = new YfNetInfoAttach();
yfNetInfoAttach.setCompany(controller.currentCompany());
yfNetInfoAttach.setId(fid);
yfNetInfoAttach.setAffiName(strFileName);
BigDecimal b = new BigDecimal((double) fileItem.getSize() / 1024);
double fileSize = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
yfNetInfoAttach.setAffiSize(fileSize);
yfNetInfoAttach.setAffiType(suffixName);
yfNetInfoAttach.setNetInfoId(netInfoId);
yfNetInfoAttach.setAffiStuts("0");
yfNetInfoAttach.setAffiPath(strFilePath);
yfNetInfoAttach.setAffiAbs(yfNetInfo.getStrMemo());
yfNetInfoAttach.setRespNo(controller.user.getStrAccount());
yfNetInfoAttach.setCreateUser(user);
yfNetInfoAttach.setCreateDateTime(DateTools.getFullNowDateTime());
yfNetInfoAttachService.addAttach(yfNetInfoAttach);
ajaxObject.setMessage(fid+","+strFileName+","+strFilePath);
ajaxObject.setStatusCode(AjaxObject.STATUS_CODE_SUCCESS);
}
} catch (Exception e) {
e.printStackTrace();
ajaxObject.setStatusCode(500);
ajaxObject.setStatusCode(AjaxObject.STATUS_CODE_FAILURE);
}
}
if (yfNetInfoService.create(yfNetInfo) == 1) {
ajaxObject.setMessage("添加成功");
} else {
ajaxObject.setStatusCode(AjaxObject.STATUS_CODE_FAILURE);
ajaxObject.setMessage("添加失败");
}
} catch (Exception e) {
e.printStackTrace();
ajaxObject.setStatusCode(AjaxObject.STATUS_CODE_FAILURE);
ajaxObject.setMessage("程序出错,添加失败");
}
ajaxObject.setNavTabId(moduleListNavId);
return ajaxObject.toString();
}
我们将上面的代码简化一下,就是
1、传入的文件是MultipartFile类型
@RequestParam(value = "file", required = false) CommonsMultipartFile mFile
2、一部分代码是将文件信息存放到数据库当中
它们是文件名、文件后缀名、文件类型、文件大小、文件id
//获取文件名和文件后缀名
strFileName = fileItem.getName();
String fileName = strFileName.substring(0,strFileName.lastIndexOf(".")) + netInfoId.replace("-", "") + "." + suffixName;
String fileName = strFileName.substring(0,strFileName.lastIndexOf(".")) + netInfoId.replace("-", "") + "." + suffixName;
//文件id是随机生成的
String fid = UUIDUtil.getUUID();
//获取文件的大小
BigDecimal b = new BigDecimal((double) fileItem.getSize() / 1024);
double fileSize = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
//文件类型就使用后缀名来界定
//文件路径适当处理一下然后存数据库
String contentUploadPath = "/static/NetInfoUpload";
strFilePath = contentUploadPath + "/" + userName + "/" + fileName;
3、一部分代码是将文件写入文件流然后放到本地项目的文件夹上面
if (!mFile.isEmpty()) {
//开始和结束都是fileItem,可以留意一下
FileItem fileItem = mFile.getFileItem();
//假如说上传到的文件目录不存在,就重新创建一个文件目录 , 后面的两个参数代表了具体的文件存放位 置
File uploadFileDirct = new File(appPath, userName);
//创建文件流
File uploadFile = new File(uploadFileDirct, fileName);
fileItem.write(uploadFile);
}