我们到底能走多远系列(21)
扯淡:又是一年过年,给各位拜个很早很早的年,实在点的祝福:祝各位明年工资全部翻一番啦!
主题:
1,判断上传图片尺寸功能
如下代码即可在页面上结果掉这个问题:
var iconElement = $("#photo");
var image = new Image();
image.src = iconElement.attr("src");
var realWidth = image.width;
var realHeight = image.height;
但是因为我后续代码中使用了截图的插件,导致插件无法正常使用。
被迫本人改变了流程:
点击file按钮-->选择图片-->onchange事件上传图片到后台-->后台判断图片尺寸-->返回结果
上传图片的js代码:根据msg的值来判断尺寸是否符合。
$.ajaxFileUpload({url:"uploadPreviewImage.html",
secureuri:false,
fileElementId:"advImage",
dataType:"json",
success:function (data , status) {
if(data.msg=="1"){//后台检测尺寸不符合
alert("图片大小小于480×520,无法进行裁剪");
return;
}
},
error:function (data, status, e) {
//alert("图片上传失败,请重新选择图片");
}
});
后台判断代码:代码中的实现是先把文件保存下来,然后利用BufferedImage 来判断尺寸,不符合删除。
其实可以在没有生成文件的时候直接进行判断尺寸,不符合就不用产生文件了。我这个是比较差的实现:
public ModelAndView uploadPreviewImage(HttpServletRequest request, HttpServletResponse response) throws IOException{
User user = (User)request.getSession().getAttribute("user");
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
MultipartFile image = multipartRequest.getFile("advImage");
response.setCharacterEncoding(BusinessConstants.ENCOD_UTF);
response.setHeader("ContentType", "json");
PrintWriter out = response.getWriter();
// 组合零时图片名
String imageName = image.getOriginalFilename();
String file_ext = imageName.substring(imageName.lastIndexOf(BusinessConstants.DOT) + 1);
SimpleDateFormat df = new SimpleDateFormat(BusinessConstants.DATE_FORMAT);
String tempImageName = user.getId() +BusinessConstants.UNDERLINE + df.format(new Date()) + BusinessConstants.DOT + file_ext;
// 存放浏览图片的零时文件路径
File file = new File(request.getSession().getServletContext().getRealPath(BusinessConstants.TEMP_PICTURE_PATH +
tempImageName));
byte[] advImageBytes = null;
InputStream advImageStream = null;
String msg = "0";
try {
file.createNewFile();
advImageStream = image.getInputStream();
advImageBytes = FileCopyUtils.copyToByteArray(advImageStream);
FileCopyUtils.copy(advImageBytes, file);
advImageStream.close();
BufferedImage buff = ImageIO.read(file);
// 判断图片大小
if(buff.getWidth() < 480 || buff.getHeight() < 520){
msg="1";
file.delete();
}
} catch (IOException e) {
e.printStackTrace();
}
String tempPath = BusinessConstants.TEMP_RELATIVE_PICTURE_PATH +
tempImageName;
// 传给页面相对路径
out.print("{");
out.print("tempPath:'"+tempPath+"',");
out.print("msg:'"+msg+"'");
out.print("}");
out.flush();
out.close();
// ajax
return null;
}
上传利用的是ajaxupload插件,那么网上的朋友也有一些遇到过这种问题:就是文件上传后,file内的value就清空了,没有保留。
事实上,ajaxFileUpload没有使用ajax来实现文件上传,它只是利用iframe,局部刷新的方式来模拟ajax的效果,这样就可以理解路径内容没有保留了。
那么是不是我们在上传完后,把路径内容重新赋值给这file呢?理论上是可行的,但这个可能牵涉到浏览器的安全机制,个人觉得这样去做有点死胡同的感觉。
那么问题就是:onchange上传完文件 file标签是空的,体验上下降不少。结合上面的分析,比较好的做法就是在完成上传返回后,把file隐藏,显示上传成功。这样的方式很简单,也不用一直想着怎么把路径表现出来了。
至于页面上的file标签怎么隐藏,提示怎么显示:
可以利用jquery来操作:
$('#shopNameId').show();
$('#batchshopNameId').hide();
效果这样:
上传前:
上传后:
点击重新上传后:
2,关于页面checkbox 多选的后操作的问题:
场景是:选中多个checkbox后,进行后台交互,比如删除这些几条数据什么的。
如何取得选中的checkbox的id数组呢?
一下是利用jquery完成的,但是牵涉到浏览器问题,所以看到这里的你,能否提供避开浏览器兼容问题的代码出来呢,谢谢啦。
var isIE=!!window.ActiveXObject;
var isIE6=isIE&&!window.XMLHttpRequest;
var list = new Array();
if(isIE6){
$("input[type=checkbox][name='chk_id'][checked]" ).each(function(i){
list.push(this.id);
})
}else{
$("input[type=checkbox][name='chk_id']").each(function(){
if($(this).attr("checked") == true){
list.push(this.id);
}
})
}
if(list.length<1){
alert("请先选择批量修改的数据");
return;
}
3,下拉框联动问题:
页面上连个下拉框有联系,比如省市关系,行业大类小类
选择大类后小类的下拉框就内容就改变。
下拉框的代码:开始的时候大类给内容可选择,选择后出发js事件,用ajax去后台把对应的小类数据取出显示:
<select id="parentSelect" name="parentSelect" style="margin:0px 5px; height:20px; line-height:20px;">
<c:forEach items="${industryList}" var="item" varStatus="status">
<option id="${item.id }" value="${item.id }">${item.name }</option>
</c:forEach>
</select>
小类<select id="childSelect" disabled="disabled" name="childSelect" style="margin:0px 5px;height:20px;line-height:20px;">
</select>
出发事件的js:
$(document).ready(function(){
$("#parentSelect").change(function(){
var parentId = $(this).find("option:selected").attr("id");
$.post("getChildIndustry.html",{parentId:$(this).find("option:selected").attr("id")},
function(date)
{
$("#childSelect").html('');
$("#industry").html("");//这个其实是一个隐藏的div <div id="industry" style="display: none;"></div>
$(date).appendTo('#industry');
var childList = $("child");
$.each(childList,function(key,val){
var value = document.getElementById(val.id);
var isChrome = window.navigator.userAgent.indexOf("Chrome") !== -1;
var id;
var name;
if(isChrome){
name = value.innerHTML;
}else{
name = value.str;
}
id = val.id;
$('<option value=' + id + '>'+ name + '</option>')
.appendTo('#childSelect'); //添加下拉框
$("#childSelect").attr('disabled', '') //2号下拉框可用
});
});
});
至于像页面上默认选中也是比较方便的。
总结:
1,有时候,代码打的快还不如方案选选得好。
2,js一旦牵涉到兼容问题就头大,看来页面的编码还真是一般人干不了的啊...
让我们继续前行
----------------------------------------------------------------------
努力不一定成功,但不努力肯定不会成功。
共勉。