项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库)
备注:本案例,作为Demo,包含少量的项目业务逻辑,input多图上传的逻辑是完整的;
不废话直接上代码
1-前端标签
//属性:multiple; 表示input标签支持选择多图 //属性:accept="image/*"; 顾虑选择范围,只允许上传图片 //'${entity.id}' 是业务数据,和多图上传本身没有直接关联 <input type="file" onchange="uploadAndSaveMaterialPic(this,'${entity.id}')" multiple accept="image/*" />
2-前端JavaScript
<script>
//1-oss上传材料图片并保存到数据(基本逻辑:先将图片全部上传到OSS并返回图片URL列表,然后将图片URL列表保存到数据库)
function uploadAndSaveMaterialPic(data,materialId) {
var files = data.files;
//1-封装formdata
var formData = new FormData();
for(var i=0; i<files.length; i++){
formData.append("mulFiles", files[i]);//1-封装图片
}
formData.append("fileType", 1);//2-封装文件类型-1表示是图片
//2-封装ajaxObject
var ajaxObject ={};
ajaxObject.success = function(result){
//保存图片
var ajaxObject = {};
ajaxObject.url = "productmaterialfile/saveBatch";
ajaxObject.data = {materialId: materialId,fileUrlList:result.data}
ajaxObject.success = function(){
//location.reload();
}
ajaxPost(ajaxObject);
}
//3-上传图片到OSS,并在success时,回调保存数据到数据的逻辑
uploadMultiFileToOSS(ajaxObject,formData);
}
//2-上传多个文件导OSS
function uploadMultiFileToOSS(ajaxObject,formData){
debugger;
var success = ajaxObject.success;
$.ajax({
url: "upload/multi/file",
type: "post",
data: formData,
cache: false,
processData: false,
contentType: false,
success:function(result){
console.log(result.code+" "+ result.msg);
if (result.code==200){
if(success){
console.log("file url -->"+result.data);
success(result);
}
}else{
console.log(result.msg);
}
},
error:function(e){
bootbox.alert("上传失败");
}
});
}
</script>
3-后台Controller
//1-后台-上传图片到OSS @RequestMapping(value = { "upload/multi/file" }, method = { RequestMethod.POST }, produces = { JSON_UTF8 }) @ResponseBody public Object uploadMultiFile( @RequestParam (value="fileType",required=true)Integer fileType, @RequestParam(value="mulFiles",required=true) MultipartFile[] mulFiles, HttpServletRequest request ) throws Exception{ if(mulFiles == null || mulFiles.length == 0){ return ResponseMessageEnum.ERROR_NO_FILE.appendEmptyData(); } try { //保存图片到OSS,并返回图片url列表,这里不具体展开 List<String> filePathList = AliyunOSSUtil.uploadMultiFile(mulFiles, UplocadFilePathTypeEnum.getNameByKey(fileType)); return ResponseMessageEnum.SUCCESS.appendObjectToString(filePathList); } catch (Exception e) { return ResponseMessageEnum.FILE_UPLOAD_ERROR.appendEmptyData(); } } //2-后台-爆保存图片数据到数据库 @RequestMapping(value = "productmaterialfile/saveBatch", method = RequestMethod.POST, produces = { JSON_UTF8 }) @ResponseBody public String saveBatch(@RequestBody ProductMaterialMultiFileReq productMaterialMultiFileReq) throws Exception { try { /**保存数据到数据库的逻辑shenglue*/ } catch (Exception e) { logger.warn(e.toString(), e); return ResponseMessageEnum.SERVER_SQL_ERROR.toString(); } return ResponseMessageEnum.SUCCESS.appendEmptyData(); } //后台-请求参数接收实体类 public class ProductMaterialMultiFileReq { private Long materialId; // 素材id List<String> fileUrlList; public Long getMaterialId() { return materialId; } public void setMaterialId(Long materialId) { this.materialId = materialId; } public List<String> getFileUrlList() { return fileUrlList; } public void setFileUrlList(List<String> fileUrlList) { this.fileUrlList = fileUrlList; } }
浙公网安备 33010602011771号