如果有非图片文件或是图片尺寸过大,会弹出提示:
或者您可以直接将桌面上的图片拖到接受拖拽的区域处:
释放后图片就可以直接预览了(此时还未上传到服务器上):
此时图片可提前删除,也可以直接上传,例如,我们点击上传按钮,很快的,图片上传成功啦:)!
上传后的页面地址就返回了,如下:
此时,对应的upload文件夹下面这张图片就有了:
注意:鄙人博客空间大小有限,我会定时清理该图片文件夹,so, 诸位不要把这里当做免费的图片托管场所哦~~
三、核心骨架脚本简单剖析
首先是文件上传的一个core文件,是前两个晚上慢慢吞吞整出来的。文件名是: zxxFile.js (可右键……下载)
此文件就几K,百来行代码,主要负责文件上传相关的逻辑(选择、删除之类),原生JS,因此,兼容jQuery,YUI, MooYools等。zxxFile.js其实是个小巧的骨架文件,肉体等则需要另外添加。
zxxFile.js其实就是个小小对象而已:
var ZXXFILE = {//骨架们...}下表显示为ZXXFILE对象的属性(骨架)及其对应的内容含义等。
补充说明:上面多次提到的file参数指的是file object对象,该对象的属性值有name, size, type等,然后,在zxxFile.js中,其还多了个方便元素定位的index索引属性。
显然,只有骨架基本上做不了什么事件。demo页面之所以有效果,就是其按照上面的骨架,根据实际的需求增加了血肉。您可以直接“右键-查看页面源代码”一览所有相关JavaScript。或者看我下面一点一点婆妈的讲述。
我们按照上面表格中的骨架进行示意。demo页面借用了比较流行的jQuery库,骨架+血肉 = 插件,当然,demo页面并不是奔着插件去的(虽然只需稍加修改),因为页面的UI显然不够插件的份。也就是说,利用zxxFile.js骨架,配合点你自己属性的JavaScript库就可以书写属于你自己的基于HTML5的多文件Ajax上传插件啦!
四、demo页面的些代码
demo页面代码整体逻辑如下:
var params = {//血肉们};ZXXFILE = $.extend(ZXXFILE, params);ZXXFILE.init();fileInput
dragDrop: $("#fileDragArea").get(0),upButton: $("#fileSubmit").get(0)url
filter: function(files) {var arrFiles = [];for (var i = 0, file; file = files[i]; i++) {if (file.type.indexOf("image") == 0) {if (file.size >= 512000) {alert("您这张""+ file.name +""图片大小过大,应小于500k"); } else {arrFiles.push(file); }} else {alert("文件"" + file.name + ""不是图片。"); }}return arrFiles;}zxxFile.js会自动对过滤后的文件对象列表进行整合,以准确上传。
var reader = new FileReader(), htmlImage;reader.onload = function(e) {htmlImage = "<img src=""+ e.target.result +"" />";}reader.readAsDataURL(file);在本demo页面中,该部分完成脚本如下,虽好像有些长度,其实内容就是装载一些HTML代码而已:
onSelect: function(files) {var html = "", i = 0;//等待载入gif动画$("#preview").html("<div class="upload_loading"></div>");var funAppendImage = function() {file = files[i];if (file) {var reader = new FileReader()reader.onload = function(e) {html = html + "<div id="uploadList_"+ i +"" class="upload_append_list"><p><strong>" + file.name + "</strong>"+ "<a href="javascript:" class="upload_delete" title="删除" data-index=""+ i +"">删除</a><br />" +"<img id="uploadImage_" + i + "" src="" + e.target.result + "" class="upload_image" /></p>"+ "<span id="uploadProgress_" + i + "" class="upload_progress"></span>" +"</div>";i++;funAppendImage();}reader.readAsDataURL(file);} else {//图片相关HTML片段载入$("#preview").html(html);if (html) {//删除方法$(".upload_delete").click(function() {ZXXFILE.funDeleteFile(files[parseInt($(this).attr("data-index"))]);return false; });//提交按钮显示$("#fileSubmit").show(); } else {//提交按钮隐藏$("#fileSubmit").hide(); }}};//执行图片HTML片段的载人funAppendImage(); }细心的你可能发现到上面的HTML元素中基本上都用到了i这个索引,作用是方便后面删除可以找到相应的元素。
onDelete: function(file) {$("#uploadList_" + file.index).fadeOut();}onDragOver方法
onDragOver: function() {$(this).addClass("upload_drag_hover");}onDragLeave方法
onDragLeave: function() {$(this).addClass("upload_drag_hover");}onProgress方法
onProgress: function(file, loaded, total) {var eleProgress = $("#uploadProgress_" + file.index), percent = (loaded / total * 100).toFixed(2) + "%";eleProgress.show().html(percent);}onSuccess方法
onSuccess: function(file, response) {$("#uploadInf").append(""<p>上传成功,图片地址是:" + response + ""</p>");}onFailure方法
onFailure: function(file) {$("#uploadInf").append("<p>图片" + file.name + "上传失败!</p>"); $("#uploadImage_" + file.index).css("opacity", 0.2);}onComplete方法
onComplete: function() {//提交按钮隐藏$("#fileSubmit").hide();//file控件value置空$("#fileImage").val("");$("#uploadInf").append("<p>当前图片全部上传完毕,可继续添加上传。</p>");}PHP页面相关代码
$fn = (isset($_SERVER["HTTP_X_FILENAME"]) ? $_SERVER["HTTP_X_FILENAME"] : false);if ($fn) {file_put_contents("uploads/" . $fn,file_get_contents("php://input"));echo "http://www.zhangxinxu.com/study/201109/uploads/$fn";exit();}以上就是主要的些功能或交互代码。至于CSS样式部分以及HTML代码中的一些细节我就懒得捡芝麻了。您有兴趣可以通过查看源代码观摩观摩。