一个项目中,肯定是需要图片上传功能,但是总不可能每个需要上传图片的地方都写一套js逻辑,写一套获取上传后的图片路径方法,因此我们需要将其抽取成一个ftl,需要上传的地方包含进来即可。如下效果:
然后点击上传完后:
并且很方便的获取上传图片的url或者图片ID。
上面就是需求啦,现在我们来分析下,要实现这种效果需要考虑的问题是啥?
1、样式问题
首先,我们知道,文件上传用的是input标签,但是我们的input标签样式很诡异,如下:
真是丑晕了,并且像我这种css很弱的,感觉怎么调都有问题,所以这是第一个问题,当然对于大神来说,这个是小case啦。
解决方法:用相对定位然后让input的透明度为0,也就是全透明。
2、如何获取上传后的图片问题
如果我们一个页面只有一个地方需要上传,那么当然很简单啦,指定上传主键里的id即可,然后用户使用的时候就直接根据id即可,但是假如一个页面有好多个图片要上传,那么我们怎么获取上传后图片的链接呢,怎么去区分?
解决方法:让用户传过控件ID到组件中,然后组件内部根据用户传过来的ID生产保存上传后返回的链接的input.
<input type="hidden" id="用户传过来的ID">
然后用户上传完图片就直接更具自己定义的ID来获取值啦。
3、代码实例
<style>.uploadFileAssembly {position:relative;height:50px;width:50px;display: inline-block;background: #F5F5F5;border-radius: 4px;overflow: hidden;text-decoration: none;text-indent: 0;border: 1px solid #bbb;background:url("/activitymgr/images/defaultimg.png") no-repeat;background-size: 50px 50px;vertical-align: middle;}.uploadFileAssembly input {width:100%;position: absolute;font-size: 100px;right: 0;top: 0;opacity: 0;height:100%;}</style><script src="/js/jquery-1.7.2.min.js"></script><script>function uploadFile${id}() {var formData = new FormData($("#${id}_span form")[0]);$.ajax({url: '/uploadFile' ,type: 'POST',data: formData,async: false,cache: false,contentType: false,processData: false,success: function (data) {var result = data.result;if(result=="success"){var id = data.id;var url = data.url;$("#${id}").val(id);$("#${id}_span").css("background-image","url("+url+")");}else{alert(data.msg);}},error:function(){alert("上传失败");}});}$(function(){$("#${id}_span form input").change(function () {//如果value不为空,调用文件加载方法if($(this).val() != ""){uploadFile${id}();}});});</script><span id="${id}_span" class="uploadFileAssembly"><form><input type="file" class="uploadFileAssemblyInput" name="filedata" placeholder="输入文件" /></form><input type="hidden" value="" id="${id}" class="uploadFileAssemblyId"></span>
上面最重要的是${id},这个id不仅把每个组件区分独立开来了,而且方法也独立开来了,不会互相混乱冲突,完全是属于控件自己。
function uploadFile${id}() {}
然后我们怎么使用该组件呢,代码如下:
<div>第一张图片:<#assign id = "first"><#include "/assembly/uploadFile.ftl"></div><div>第二张图片:<#assign id = "second"><#include "/assembly/uploadFile.ftl"></div>
这样就可以了,跟博文开头的样式一样。
用户上传完图片后想要获取上传的值就直接:
var img1 = $("#first").val();var img2 = $("#second").val();
这样就打工告成啦。
备注:
上面的上传图片的ajax方法只是我这边的实现方法,每个用户都有自己的实现,主要关注样式和js实现以及怎么传id即可。
