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

写一个基于HTML5的文件异步上传控件

现在文件上传控件有很多,比如JQuery的jQueryFileUpload等等。功能必须说,非常强大,官方文档写的也很清楚。要说缺点也只有一个,加载

现在文件上传控件有很多,比如JQuery的jQuery File Upload等等。功能必须说,非常强大,官方文档写的也很清楚。要说缺点也只有一个,加载的文件很多(举例的这个光js就有4个,这对服务器来说是负担),通常在web开发中不需要这么多功能,本这对前端开发的优化,在加上现在html5的普及,自己写一个适合自己的控件非常有必要。

废话不多说,直接上代码

前端代码,其中已经有了注释了








文件名上传进度




upload.js代码

var upload = function(input){
if(window.FormData)
{
if(input.val() == '' || input.val() == 'undefined')
return false;

var files = input[0].files;//保存要上传的文件
var formData = new FormData();//文件上传通道
var fileReader = new FileReader();

var getFileType = function(filename){
var extStart = filename.lastIndexOf(".")+1;
return filename.substring(extStart,filename.length).toUpperCase();
};

var clearInput = function(){
input.val('');
};

var getKey = function(){//获得一个key 10位数字 这样可以保证几率比较小了 假如还想要几率小 可以计算md5
return Math.floor(Math.random()*10000000000);
};

var key = getKey();//保存文件的唯一key
var url = input.attr('data-url')||arguments[1].url;//上传地址
var progress = arguments[1].progress;//上传进度条
var complete = arguments[1].complete;//上传完成
var error = arguments[1].error;//上传失败
var maxSize = arguments[1].maxSize;//文件大小 单位字节 过滤器
var fileType = arguments[1].fileType;//文件类型 过滤器
var data = arguments[1].data;//额外数据
var OnStart= arguments[1].onStart;//准备上传
var abortBtn = arguments[1].abortBtn;//中断上传按钮
var OnAbort= arguments[1].onAbort;//中断函数
//文件类型验证
var type = getFileType(files[0].name);//获得文件类型
var typeAllow = false;
if(typeof fileType == 'object')
{
var arrayType = fileType.type;
$.each(arrayType,function(index,value){
if(value.toUpperCase() == type)
{
typeAllow = true;
return false;//相当于break
}
});
if(!typeAllow)
{
fileType.error(files[0],key);
return false;
}
}
//文件大小验证
if(typeof maxSize == 'number')
{
if(files[0].size >= maxSize)
{
maxSize.error(files[0],key);
return false;
}
}
else if(typeof maxSize == 'object')
{
if(files[0].size >= maxSize.size)
{
maxSize.error(files[0],key);
return false;
}
}
//将文件加入到上传通道
formData.append(input.attr('name')||'files', files[0]);
var xhr = new XMLHttpRequest();
//附加额外的数据
if(data != '' && data != 'undefined')
{
$.each(data,function(index,value){
formData.append(index,value);
});
}
//开始上传
xhr.open('POST',url,true);
xhr.Onload= function(){
if(xhr.status == 200 && xhr.readyState == 4)
{
if(typeof complete == 'function')
complete(xhr.response,files[0],key);
//clearInput();
}
else
{
if(typeof error == 'function')
error(files[0],key);
}
};
xhr.upload.Onprogress= function(event){
progress(event,files[0],key);
};
xhr.Onloadstart= function(event){
onStart(event,files[0],key);
};
xhr.send(formData);
//添加中断
$('.'+key).find(abortBtn).click(function(){
xhr.abort();
onAbort(files[0],key);
});
return {key:key,xhr:xhr};
}
else
{
alert('浏览器版本过低');
return null;
}
}


暂时input元素中不支持multiple属性,我尝试过,js没办法获取到多个文件的信息,只能获取到一个,假如有知道的请给我留言,我随时改进

以上代码在chrome中测试通过

后台获取方式和正常的一样,对文件大小没有限制,假如有限制也是服务器软件或者后台语言的限制,在初始化参数中你可以设立上传的大小限制,



推荐阅读
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • Nginx 反向代理配置与应用指南
    本文详细介绍了 Nginx 反向代理的配置与应用方法。首先,用户可以从官方下载页面(http://nginx.org/en/download.html)获取最新稳定版 Nginx,推荐使用 1.14.2 版本。下载并解压后,通过双击 `nginx.exe` 文件启动 Nginx 服务。文章进一步探讨了反向代理的基本原理及其在实际应用场景中的配置技巧,包括负载均衡、缓存管理和安全设置等,为用户提供了一套全面的实践指南。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 在安装并配置了Elasticsearch后,我在尝试通过GET /_nodes请求获取节点信息时遇到了问题,收到了错误消息。为了确保请求的正确性和安全性,我需要进一步排查配置和网络设置,以确保Elasticsearch集群能够正常响应。此外,还需要检查安全设置,如防火墙规则和认证机制,以防止未经授权的访问。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 在 CentOS 6.5 系统上部署 VNC 服务器的详细步骤与配置指南
    在 CentOS 6.5 系统上部署 VNC 服务器时,首先需要确认 VNC 服务是否已安装。通常情况下,VNC 服务默认未安装。可以通过运行特定的查询命令来检查其安装状态。如果查询结果为空,则表明 VNC 服务尚未安装,需进行手动安装。此外,建议在安装前确保系统的软件包管理器已更新至最新版本,以避免兼容性问题。 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 本指南详细介绍了如何在CentOS 6.6 64位系统上以root用户身份部署Tomcat 8服务器。系统环境为CentOS 6.6 64位,采用源码安装方式。所需软件为apache-tomcat-8.0.23.tar.gz,建议将软件下载至/root/opt目录。具体下载地址请参见官方资源。本指南涵盖了从环境准备到服务启动的完整步骤,适用于需要在该系统环境下搭建高性能Web应用服务器的技术人员。 ... [详细]
  • 通过利用代码自动生成技术,旨在减轻软件开发的复杂性,缩短项目周期,减少冗余代码的编写,从而显著提升开发效率。该方法不仅能够降低开发人员的工作强度,还能确保代码的一致性和质量。 ... [详细]
  • 在本文中,我们将为 HelloWorld 项目添加视图组件,以确保控制器返回的视图路径能够正确映射到指定页面。这一步骤将为后续的测试和开发奠定基础。首先,我们将介绍如何配置视图解析器,以便 SpringMVC 能够识别并渲染相应的视图文件。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
author-avatar
手机用户2502853881
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有