一.spring配置文件上传支持
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="104857600" />
<property name="maxInMemorySize" value="4096" />
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
PS:
CommonsMultipartResolver是spring提供的文件流接收对象,支持多文件上传
3个属性我就不解释了,一看就懂。
二.java方法
@ResponseBody
@RequestMapping(value = "/save" , method = RequestMethod.POST)
public ResultDto saveRoute(HttpServletRequest request,RouteInfo routeInfo,
@RequestParam(value = "file",required = false) CommonsMultipartFile[] files,
HttpServletResponse response) {
}
PS:
RouteInfo是我的业务对象,
CommonsMultipartFile要支持多文件上传就在后面加[]
三,文件处理
for(MultipartFile multipartFile:multipartFiles){
CommonImgInfo imgModel = new CommonImgInfo();
//文件的原始名称
String originalFilename = multipartFile.getOriginalFilename();
String newFileName = null;
if (multipartFile != null && StringUtils.isNotBlank(originalFilename)){
imgModel.setFileName(originalFilename);
//newFileName = UUID.randomUUID() + originalFilename;
newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."), originalFilename.length());
//存储图片的物理路径
String pic_path = request.getSession().getServletContext().getRealPath(Config.UPLOAD_SAVEPATH);
//获取文件类型
String contentType = multipartFile.getContentType();
//获得文件后缀名称
String imageName = contentType.substring(contentType.indexOf(File.separator) + 1);
File fileParent = new File(pic_path);
if(!fileParent.exists()) {
fileParent.mkdir();
}
imgModel.setMimeType(imageName);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String mills = format.format(System.currentTimeMillis());
String path = pic_path + File.separator + mills+ File.separator;
File f = new File(path);
//如果文件夹不存在,创建文件夹
if(!f.exists()) {
f.mkdir();
}
//新图片路径
File targetFile = new File(path, newFileName);
//内存数据读入磁盘
multipartFile.transferTo(targetFile);
String targetPath = File.separator + Config.UPLOAD_SAVEPATH + File.separator + mills + File.separator + newFileName;
imgModel.setLocation(targetPath);
imgModel.setContentSize(multipartFile.getSize());
newFileNames.add(imgModel);
}
}
ps:
CommonImgInfo是我们专门为文件建立的一个对象,里面的字段有:
原始文件名/新文件名/文件存储路径/文件后缀名/业务类型/业务关联id/文件大小/时间
三,前端页面
使用的就是input标签,type为file
<input type="file" id="file" class="inputfile" multiple="multiple" accept="image/png, image/jpeg, image/gif, image/jpg" onchange="changepic(this)" />
<label for="file" class='btn btn-success'>选择图片</label>
美化下按钮,这里顺带给样式大家
<style type="text/css">
.inputfile {
opacity: 0;
}
</style>
效果:
上面每次选定图片后实际是通过js增加的一个img标签,然后有删除x的是通过div写的,也提供给大家吧
<div id="img_div_0" style="position: relative;max-width: 200px;overflow: hidden; float:left;margin: 10px 10px 0px 0px; border: 1px solid #eee;">
<div style="position: absolute;width: 50px;height: 50px;border-radius: 25px;top: -20px;right: -20px;background-color: rgba(0,0,0,0.2);color:#fff; padding-top: 24px; padding-right: 12px;cursor:pointer;" onclick="delImg(0)">
</div>
<div style="position: absolute;top: 4px;right: 10px;color:#fff;cursor:pointer; " onclick="delImg(0)">x</div>
<img id="" alt="" style="width: 100%;height:100px;" src="blob:http://localhost:8082/6df3c8df-fb80-4333-a62b-0ca7f66d8867">
</div>
大家动态去拼接吧。
提交使用formData + jquery的ajax,关键代码:
var formData = new FormData(document.getElementById("routeInfoForm"));
if(filesArr.length > 0){
for(var i = 0;i < filesArr.length;i++){
formData.append('file',filesArr[i]);
}
}
formData.append('id',vm.id);
formData.append('routeName',vm.routeName);
formData.append('wifiPwd',vm.wifiPwd);
formData.append('routeUserName',vm.routeUserName);
formData.append('routePwd',vm.routePwd);
formData.append('factoryId',vm.manufacturerId);
formData.append('model',vm.model);
formData.append('companyId',vm.companyId);
formData.append('addressDetail',vm.addressDetail);
formData.append('onLineStatus',vm.onLineStatus);
formData.append('factoryName',vm.manufacturers.find(item => item.id === vm.manufacturerId)['name']);
ps:
filesArr是我自己定义的数组,存储的就是input的file对象的file。
注意多文件的处理,key是一样的都是file,只是内容不同而已。
其他参数也是通过append添加,忽略这里的vue取值。
到后台spring会自动把这些前台属性注入到对应的业务对象属性,而file则会使用CommonsMultipartFile接收
最后是jquery的ajax方法
$.ajax({
type:"post",
url: ctx + "/routeManager/save",
data: formData,
dataType : 'json',
async: false,
cache: false,
contentType: false,
processData: false,
success:function(data){
if(data.status == 0) {
layer.alert('创建成功!', function(){
var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
parent.layer.close(index);//再执行关闭
});
}else {
layer.msg(data.returnMsg);
}
},error:function(data) {
layer.msg(data.returnMsg);
}
});
好了,到这里关键代码基本就都完成了,剩下该你表现了。能帮到大家,希望点个赞