热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于ajax的Html5文件上传插件,带进度并支持图片预览

先上图看看效果:通过右上角最小化按钮或者双击标题栏将窗口最小化哦:花了半天只做了简单的封装和效果,有时间可以改进下,比如上传图片的时候显示缩略图、拖拽文件上传。重点来了,上代码:$.html5Uplo

先上图看看效果大笑


通过右上角最小化按钮或者双击标题栏将窗口最小化哦偷笑


花了半天只做了简单的封装和效果,有时间可以改进下,比如上传图片的时候显示缩略图、拖拽文件上传。


重点来了,上代码生气

$.html5Upload = function (param) {
var option = $.extend({
id: '', //上传界面唯一标识id
title: '', //标题文字
url: '', //文件上传后台处理地址
filter: null, //上传文件过滤函数,参数为files,必须返回files
fileNameLength: 50, //显示文件名长度
onDelete: null, //当某一个上传文件上传成功之后(自动)或被删除(手动)的时候执行的方法。接受一个参数(file),表示 当前删除文件。
onSuccess: null, //当前文件上传成功执行的回调方法。接受两个参数(file, response),表示当前上传成功的文件对象和后台返回的字符内容。
onFailure: null, //当前文件上传失败执行的回调方法。接受两个参数(file, response),表示当前上传失败的文件对象和后台返回的字符内容。
onComplete: null, //当前文件对象列表全部上传完毕执行的回调方法。无可用参数。
onClose: null, //关闭上传界面后回调函数
auto: true //自动弹出文件选择框
}, param || {});

var xhr;
var upload = $('#divFileUpload_' + option.id); //上传模块容器
if (upload.length != 0) {
upload.remove();
}
if ($('#file_upload').length == 0) {
$('body').append("");
$('#file_upload').bind('change', function (e) {
funDealFiles(e.target.files || e.dataTransfer.files);
$('#file_upload').val('');
});
}
upload = $("
" +
"
" + option.title + "
" +
"
" +
"
选择文件
" +
"
上 传
" +
"
关 闭
" +
"
或者将文件拖到此处
" +
"
" +
"
" +
"
" +
"
").appendTo('body');

$('#upload_btn_select_' + option.id).click(function () {
//浏览
$('#file_upload').click();
});
$('#upload_btn_upload_' + option.id).click(function () {
//上传
sendFile();
});
$('#upload_btn_close_' + option.id).click(function () {
//关闭
if (confirm('确定关闭吗?')) {
if (option.onClose) {
option.onClose.call(this);
}
$('#upload_' + option.id).remove();
}
});
//拖拽上传
var dragDrop = $('#upload_drag_' + option.id)[0];
dragDrop.addEventListener("dragover", function (e) {
e.stopPropagation();
e.preventDefault();
$(this).addClass("upload_drag_hover");
}, false);
dragDrop.addEventListener("dragleave", function (e) {
e.stopPropagation();
e.preventDefault();
$(this).removeClass("upload_drag_hover");
}, false);
dragDrop.addEventListener("drop", function (e) {
e.stopPropagation();
e.preventDefault();
$(this).removeClass("upload_drag_hover");
funDealFiles(e.target.files || e.dataTransfer.files);
}, false);

$('.upload_title', upload).dblclick(function () {
$('.upload_btn_mini', upload).click();
});

$('.upload_btn_mini', upload).click(function () {
var _this = $(this);
var title = _this.attr('title');
if (title == '最小化') {
//最小化
_this.attr('title', '还原').removeClass('upload_btn_mini_yc').addClass('upload_btn_mini_hy').data('offset', upload.offset()).parent().attr('title','双击还原窗口');
upload.animate({ width: '200px', height: '33px', bottom: '10px', right: '10px' }, 200);
} else {
//还原
var offset = _this.data('offset');
upload.animate({ width: '480px', height: '290px', bottom: offset.top, right: offset.left }, function () {
upload.removeAttr('style');
});
_this.attr('title', '最小化').removeClass('upload_btn_mini_hy').addClass('upload_btn_mini_yc').parent().attr('title', '双击最小化窗口');
}
});

if (option.auto) {
$('#divFileUpload_btn_select_' + option.id).click();
}

//选中文件的处理与回调
var funDealFiles = function (files) {
//过滤文件
if (typeof (option.filter) == 'function') {
files = option.filter.call(this, files);
}
var i = 0;
var funAppendImage = function () {
var file = files[i];
if (file) {
var fileName = file.name.length > option.fileNameLength ? file.name.substr(0, option.fileNameLength) + '...' : file.name;
var fileDiv = $("
" +
"
" + fileName + "(" + (file.size / 1024).toFixed(2) + "kb)
删除
" +
"
" +
"
" +
"
" +
"
" +
"
").data('file', file).appendTo('#upload_list_' + option.id);
var cancle = fileDiv.find('.upload_item_del');
cancle.click(function () {
//删除
var tmp = $(this).parent();
if (tmp.attr('status') == 'uploading') {
if (confirm('确定删除当前文件吗?')) {
xhr.abort();
}
} else {
tmp.remove();
}
});

//如果是图片,则显示缩略图
if (file.type.indexOf('image') != -1) {
var reader = new FileReader();
reader.Onload= function (e) {
//展示img
$('.upload_item_title', fileDiv).before("
");
}
reader.readAsDataURL(file);
}
i++;
funAppendImage();
} else {
//遍历结束

}
};
funAppendImage();
};

function sendFile() {
var list = $('.upload_item[status=start]', upload);
if (list.length == 0) {
if (typeof (option.onComplete) == 'function') {
//全部完成事件
option.onComplete.call();
}
return;
}
var fileDiv = list.eq(0).attr('status', 'uploading');
var file = fileDiv.data('file');
var msg = fileDiv.find(".upload_item_progress_msg");
var bg = fileDiv.find(".upload_item_progress_bg");

//上传到服务器
xhr = new XMLHttpRequest();
xhr.Onreadystatechange= function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
fileDiv.attr('status', 'uploaded');
//bg.css('width', '100%');
var obj = eval("(" + xhr.responseText + ")");
if (typeof (option.onSuccess) == 'function') {
//上传成功事件
option.onSuccess.call(this, obj);
}
}
xhr = null;
sendFile();
}
};

xhr.upload.Onprogress= function (e) {
//进度显示
if (e.lengthComputable) {
var percentage = Math.round((e.loaded * 100) / e.total);
msg.html(percentage + ' %');
bg.animate({ width: percentage + '%' }, 100);
}
};

xhr.Onabort= function (e) {
fileDiv.remove();
sendFile();
}
xhr.Onload= function (e) {

};
xhr.Onerror= function (e) {
msg.html("上传失败!");
fileDiv.attr('status', 'error');
if (typeof (option.onFailure) == 'function') {
//上传失败事件
option.onFailure.call();
}
sendFile();
}
xhr.open('post', option.url, true);
var formData = new FormData();
formData.append("file", file);
xhr.send(formData);
msg.html("上传中...");
}
};


推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
author-avatar
安徒生童话13
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有