图片异步上传插件使用总结
如图所示要实现的异步图片上传功能,一直被这个功能困扰了好久,昨天终于算是搞定了,学习了两个插件ajaxfileupload和jquery-form的使用方法,以及总结了它们的特点和注意事项,废话少说直接上代码(如果想看效果的话还是要放在服务器上进行测试的):
ajaxfileupload:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <style type="text/css"> .upload-box{ width: 150px; height: 150px; overflow: hidden; position: relative; border: 1px solid #ccc; } .upload-box .btnfile{ position: absolute; top: 0; left: 0; z-index: 99; width: 150px; height: 150px; opacity: 0; } .upload-box .divimg{ width: 150px; height: 150px; padding: 10px; box-sizing: border-box; text-align: center; vertical-align: middle; overflow: hidden; } .upload-box .divimg .defaultImg{ font-size: 100px; color: #999; font-weight: bold; } </style> </head> <body> <div class="upload-box"> <!-- input[type="hidden"]的作用:input[type="file"]不允许填写vale值,这样path值赋予隐藏的input在form表单提交的时候同样可以上传图片路径 --> <input type="hidden" name="spec_logo" value=""/> <!-- file_name:后台定义的file控件name --> <input type="file" id="btnfile-1" class="btnfile" name="file_name" value="上传" /> <div class="divimg"> <span class="defaultImg">+</span> </div> </div> <div class="upload-box"> <input type="hidden" name="spec_logo" value=""/> <input type="file" id="btnfile-2" class="btnfile" name="file_name" value="上传" /> <div class="divimg"> <span class="defaultImg">+</span> </div> </div> <script src="../js/jquery-1.7.2.min.js"></script> <script src="../js/ajaxfileupload.js"></script> <script> //项目中遇到的问题:如果单个页面中需要显示多个图片上传的div的话,就需要多个不同的file控件ID供调用, //如果upload-box是动态生成的,那么就要想办法生成不同的file控件ID $(document).ready(function() { //图片上传地址 var upload_url = '<?= base_url('tupload/single?bucket=saler')?>'; //这里直接用change事件只能执行一次,改为on事件正常执行,当选择好图片打开,关闭窗口时触发此事件 $('body').on('change', 'input[name="file_name"]', function() { var id = $(this).attr('id'); var divimg = $(this).siblings('.divimg'); var spec_logo = $(this).siblings('input[name="spec_logo"]'); $.ajaxFileUpload({ url: upload_url, //处理图片的脚本路径 type: 'post', //提交的方式 secureuri: false, //是否启用安全提交 fileElementId: id, //file控件ID dataType: 'json', //服务器返回的数据类型 success: function (data, status){ //提交成功后自动执行的处理函数 //后台定义的图片路径规则 var upload_ret = data.data; var path = upload_ret.path;//半路径 var full_path = upload_ret.full_path;//全路径 divimg.empty(); divimg.append('<img src="'+ full_path +'" width="100%"/>'); spec_logo.val(path); }, error: function(data, status, e){ //提交失败自动执行的处理函数 alert(e); } }) }); }); </script> </body> </html>
jquery-form:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <style type="text/css"> .imgBox{ width: 150px; height: 150px; overflow: hidden; position: relative; border: 1px solid #ccc; } .imgBox .btnfile{ position: absolute; top: 0; left: 0; z-index: 99; width: 150px; height: 150px; opacity: 0; } .imgBox .divimg{ width: 150px; height: 150px; padding: 10px; box-sizing: border-box; text-align: center; vertical-align: middle; overflow: hidden; } .imgBox .divimg .imgDefault{ font-size: 100px; color: #999; font-weight: bold; } </style> </head> <body> <form id="fm1" method="post"> <div class="imgBox"> <!-- file_name:后台定义的file控件name --> <input type="file" class="btnfile" name="file_name" value="提交"/> <div class="divimg"> <span class="imgDefault">+</span> </div> </div> <!-- <div class="imgBox"> <input type="file" class="btnfile" name="file_name" value="提交"/> <div class="divimg"> <span class="imgDefault">+</span> </div> </div> --> </form> <script src="../js/jquery-1.7.2.min.js"></script> <script src="../js/jquery-form.js"></script> <script> //jquery-form插件可以用在单个页面或者一个form表单里面只显示一个图片上传div的情况下 //实践结果,当一个form表单里面存在多个imgBox的时候,更换图片的时候会发生混乱 $(document).ready(function() { //图片上传地址 var upload_url = '<?= base_url('tupload/single?bucket=saler')?>'; $('.btnfile').change(function() { var target = $(this); var divimg = $(this).siblings('.divimg'); $("#fm1").ajaxSubmit({ url: upload_url, type: "post", success: function (data) { $('.divimg').empty(); //后台定义的图片路径规则 var upload_ret = data.data; var path = upload_ret.path;//半路径 var full_path = upload_ret.full_path;//全路径 //IE显示图片会默认加上<PRE></PRE>,着必须要把去除掉才能在低版本ie显示 //data = data.replace("<PRE>", "").replace("</PRE>", ""); $(".divimg").append("<img src='" + full_path + "' width='100%'/>"); //清空file控件里面的值 target.after(file.clone().val("")); target.remove(); } }); }); }); </script> </body> </html>
根据自己的需要选择使用哪个插件更合适