CREATE TABLE `photo` ( `id` bigint(10) unsigned NOT NULL AUTO_INCREMENT, `bizid` bigint(11) NOT NULL DEFAULT ‘-1‘ COMMENT ‘业务id,比如项目的id‘, `cover` int(11) DEFAULT ‘0‘ COMMENT ‘1:是,0:不是‘, `sort` int(11) DEFAULT ‘0‘ COMMENT ‘越小越靠前‘, `url` varchar(200) DEFAULT NULL, `name` varchar(255) DEFAULT NULL COMMENT ‘图片的原文件名‘, `remark` varchar(255) DEFAULT NULL COMMENT ‘图片备注‘, `status` int(11) DEFAULT ‘0‘ COMMENT ‘0:正常,1:已删除,2:临时的‘, `type` int(11) DEFAULT ‘1‘ COMMENT ‘1:项目资料 2:待续‘, `addtime` datetime DEFAULT NULL, `uptime` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8 COMMENT=‘用户上传的图片‘;
@RequestMapping("uploadImg")
public void uploadImg(MultipartHttpServletRequest request,
HttpServletResponse response, Long bizid,Integer type) {
MultipartFile file = request.getFile("file");
MultipartFileValidator validator = new MultipartFileValidator();
validator.setAllowedContentTypes(new String[] { "image/jpeg",
"image/pjpeg", "image/png", "image/x-png" });
String path = null;
String name = null;
try {
if (null != file && !file.isEmpty()) {
name = file.getOriginalFilename();
validator.validate(file);
path = storeFile(file);
storeSlaveFile(file, path);
} else {
throw new Exception("file is empty");
}
} catch (Exception e) {
e.printStackTrace();
super.jsonFail(response, "图片格式不正确或大小超过1M");
return;
}
Long id = null;
if (bizid != null) {
// 临时图片存起来
Photo photo = new Photo();
photo.setName(name);
photo.setUrl(path);
photo.setBizid(bizid);
photo.setStatus(2);
photo.setType(type);
id = photoService.add(photo);
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", ErrorCode.OK.getCode());
jsonObject.put("path", path);
jsonObject.put("name", name);
if (id != null) {
jsonObject.put("id", id);
}
super.returnJsonObject(response, jsonObject);
}function bindSaveEvent(){
console.log("bindSaveEvent");
$("#save").on("click", function() {
var trs=$(".tr");
var photos = new Array();
$.each(trs,function(i,n){
var tr = $(trs[i]);
var photo ={};
//newid是数据库中的id
var id=tr.attr("id");
var newid=tr.attr("newid");
photo.id=newid;
photo.cover=$("#"+id+"-cover").val();
photo.sort=$("#"+id+"-sort").val();
photo.remark=$("#"+id+"-remark").val();
photo.url=$("#"+id+"-img").attr("path");
photo.name=$("#"+id+"-name").val();
console.log("id="+id);
photos[i]=photo;
});
var json=JSON.stringify(photos);
console.log("id=${photoVo.project.id}"+",photos="+json);
$.ajax( {
url:‘project/savePhoto‘,
data:{
id : ${photoVo.project.id},
photos: json
},
type:‘post‘,
cache:false,
async: true,
dataType:‘json‘,
success:function(data) {
//alert(data.itemName);
//nameStr = data.itemName;
console.log("data="+data);
},
error : function() {
alert("保存图片失败!");
}
});
});
}function bindAddEvent(){
console.log("bindAddEvent");
$("#add").on("click", function() {
var strTemplate=
‘<tr id="{photo.id}" newid="" class="tr">‘+
‘<td><input id="{photo.id}-name" type="text" value="" /></td>‘+
‘<td><select id="{photo.id}-sort" class="sort">‘+
‘<option value="1">1</option>‘+
‘<option value="2">2</option>‘+
‘<option value="3">3</option>‘+
‘<option value="4">4</option>‘+
‘<option value="5">5</option>‘+
‘<option value="6">6</option>‘+
‘<option value="7">7</option>‘+
‘<option value="8">8</option>‘+
‘<option value="9">9</option>‘+
‘<option value="10">10</option>‘+
‘<option value="0">0</option>‘+
‘</select></td>‘+
‘<td><select id="{photo.id}-cover" owner="{photo.id}"‘+
‘class="cover">‘+
‘<option value="0">否</option>‘+
‘<option value="1">是</option>‘+
‘</select></td>‘+
‘<td><input type="text" id="{photo.id}-remark" value="" /></td>‘+
‘<td><input type="file" id="{photo.id}-file" name="file"‘+
‘style="width: 264px" onchange="uploadImg({photo.id});"><img‘+
‘ id="{photo.id}-img" src="" path=""‘+
‘ width="80%"></td>‘+
‘<td><a id="{photo.id}-del" owner="{photo.id}"‘+
‘href="javascript:;" class="del">删除</a></td>‘+
‘</tr>‘;
var photoId = new Date().getTime();
var html = strTemplate.replace(/{photo.id}/g,photoId);
var tbody = $("#tbody");
tbody.append(html);
console.log(html);
//必须为新生成的对象,重新绑定事件
bindDelEvent();
bindCoverChangeEvent();
});
}public void savePhoto(HttpServletResponse response, @RequestParam Long id,String photos) {
List<Photo> list=JSONArray.parseArray(photos, Photo.class);
projectService.savePhoto(id,list);
super.jsonSucceed(response);
}public void savePhoto(Long id, List<Photo> list) {
if (CollectionUtils.isEmpty(list)) {
logger.error("The photo list is empty~");
return;
}
// 这个项目数据库中的图片,包括所有的状态
List<Photo> dbList = photoDao.getPhotoListByProjectIdAllStatus(id);
PhotoBean photoBean = handlePhoto(list, dbList);
//理论上,不再存在add doAdd(id, photoBean.toAdd);
doUpdate(id, photoBean.toUpdate);
doDelete(id, photoBean.toDelete);
}
doUpdate和doDelete批量更新和批量删除方法,很清晰,不再赘述。
//PhotoBean的结构
class PhotoBean {
//将要删除的,通常是数据库中的
public List<Photo> toDelete;
//将要更新的,都在数据库中,部分最新内容来源于web前端
public List<Photo> toUpdate;
//将要增加的,由于上传图片的时候都已经插入了,这个时候可以忽略了
//public List<Photo> toAdd;
}
//根据前端photo集合和数据库photo集合,得到需要更新和需要删除的photo集合,不存在需要增加的photo集合
private PhotoBean handlePhoto(List<Photo> list, List<Photo> dbList) {
PhotoBean bean = new PhotoBean();
// 全部删除,什么图片都没有上传
if (CollectionUtils.isEmpty(list)) {
bean.toDelete = dbList;
}
// 全部增加,一般在第1次
/* if (CollectionUtils.isEmpty(dbList)) {
bean.toAdd = list;
}*/
// 都不为null
if (list != null && dbList != null) {
// 交集,肯定不为null,最多是empty,id相同就是共同存在
List<Photo> commonList = ListUtils.retainAll(list, dbList);
// 2者交集
List<Photo> toUpdate = commonList;
//数据库中的临时图片,状态需要改为“正常”
if(CollectionUtils.isNotEmpty(toUpdate)){
for(Photo p:toUpdate){
p.setStatus(0);
}
}
// 在list,不再dbList中的
/* List<Photo> toAdd = new ArrayList<Photo>();
for (Photo p : list) {
if (!dbList.contains(p)) {
toAdd.add(p);
}
}*/
// 在dbList,不在list中的
List<Photo> toDelete = new ArrayList<Photo>();
for (Photo p : dbList) {
if (!list.contains(p)) {
toDelete.add(p);
}
}
//bean.toAdd=toAdd;
bean.toUpdate=toUpdate;
bean.toDelete=toDelete;
}
return bean;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
图片上传-下载-删除等图片管理的若干经验总结3-单一业务场景的完整解决方案
原文地址:http://blog.csdn.net/fansunion/article/details/49446331