1.利用Jquery使用HTML5的FormData属性实现对文件的上传

  在HTML5以前我们如果需要实现文件上传服务器等功能的时候,有时候我们不得不依赖于FLASH去实现,而在HTML5到来之后,我们很容易的实现对文件的上传,只需要利用HTML5的一个FormData属性,结合Jquery就很容易实现文件的上传,而且读取文件的上传进度,下面这个上传案例就是基于上面所说的实现的,下面我将所所有的JS和CSS以及HTML页面代码放在下面。

  注意事项:FormData属性必须依赖于HTML5,所以如果你按照本文代码实现的功能,则浏览器必须升级为最新(支持HTML5 FormData属性)。

2.HTML页面代码如下

 <!DOCTYPE html>

 <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>使用HTML的FormData属性实现文件上传</title>
<link rel="stylesheet" href="../css/fileUpload.css" />
</head>
<body>
<table id="uploadTable" style="border: 1px;"></table>
<br/>
<a href="javascript:void(0);" class="input-file">
添加文件<input type="file" id="txtFile" style="width:200px;" />
</a>
<script type="text/javascript" src="../js/jquery-1.7.1-min.js"></script> <script type="text/javascript">
$(function () {
$('#uploadTable').SalesMOUNDUpload({
saveUrl: '/Test/Save',
jqInput: $('#txtFile'),
fnRemove: removeFile,
fnComplete: function (d) {
window.console.log('complete ' + d);
}
});
});
function removeFile(d) {
$.post('/Test/Remove', { "filename": d }, function(r) { });
}
</script>
</body>
</html>

3.CSS代码如下:

  /*源文件头信息:
<copyright file="FileUpload.js">
Copyright(c)2014-2034 Kencery.All rights reserved.
个人博客:http://www.cnblogs.com/hanyinglong
创建人:韩迎龙(kencery)
创建时间:2015-6-24
</copyright>*/ body
{
font-family: "微软雅黑";
font-size: 12px;
}
.input-file {
overflow: hidden;
position: relative;
}
.input-file input {
opacity:;
filter: alpha(opacity=0);
font-size: 100px;
position: absolute;
top:;
right:;
}
#uploadTable {
width: 500px;
border-collapse: collapse;
border: 1px solid Silver;
}

4.JS代码如下:

 // 源文件头信息:
// <copyright file="FileUpload.js">
// Copyright(c)2014-2034 Kencery.All rights reserved.
// 个人博客:http://www.cnblogs.com/hanyinglong
// 创建人:韩迎龙(kencery)
// 创建时间:2015-6-24
// </copyright> ;
(function($) {
$.fn.SalesMOUNDUpload = function(options) {
var defaults =
{
saveUrl: '',
jqInput: '',
maxSize: 1024 * 1024 * 100, //100M
fnRemove: '', //移除文件 ,参数:文件名
fnComplete: '' //每个文件成功 ,参数:服务器端返回内容
}; var opt = $.extend(defaults, options); function getByteToM(val) {
if (isNaN(val)) return val;
val = val / (1024 * 1024);
val = Math.round(val * 100) / 100;
return val;
} return this.each(function() {
var $this = $(this);
$this.empty(); if (typeof FormData == 'undefine') {
alert('浏览器版本太低,不支持改上传!');
return;
} //表头
if ($this.find('thead').length == 0) {
var $thead = $('<thead>');
var $th_tr = $('<tr>');
$th_tr.append('<th>文件名</th>');
$th_tr.append('<th>类型</th>');
$th_tr.append('<th>大小</th>');
$th_tr.append('<th>状态</th>');
$th_tr.append('<th>操作</th>');
$th_tr.appendTo($thead);
$this.append($thead);
} opt.jqInput[0].addEventListener('change', function(e) {
var file = this.files[0]; if (!file) {
return;
}
if (file.size > opt.maxSize) {
window.alert('文件超过最大');
return;
}
var fd = new FormData();
var $table = $this; fd.append("uploadFile", file);
var xhr = new XMLHttpRequest();
xhr.open('POST', opt.saveUrl, true); xhr.upload.addEventListener("progress", uploadProgress, false);
xhr.addEventListener("load", uploadComplete, false);
xhr.addEventListener("error", uploadFailed, false);
xhr.addEventListener("abort", uploadCanceled, false); //表中内容
var $tr = $('<tr>');
$tr.append('<td class="upload_name">' + file.name + '</td>');
$tr.append('<td class="upload_type">' + file.type + '</td>');
$tr.append('<td class="upload_size">' + getByteToM(file.size) + 'M' + '</td>');
$tr.append('<td class="upload_status">' + 0 + '</td>');
$tr.append('<td class="upload_action"><a href="javascript:void(0);">' + '取消' + '</a></td>');
$tr.find('.upload_action a').unbind('click').bind('click', function() {
xhr.abort();
}); $table.append($tr); function uploadProgress(evt) {
if (evt.lengthComputable) {
var percentComplete = Math.round(evt.loaded * 100 / evt.total);
$tr.find('.upload_status').html(Math.round(percentComplete) + '%');
} else {
$tr.find('.upload_status').html('unable to compute');
}
} function uploadComplete(evt) {
if (evt.target.status == 200) {
$tr.find('.upload_status').html('已完成');
$tr.find('.upload_action a').html('删除');
if (typeof opt.fnComplete == 'function') {
opt.fnComplete(evt.target.response); }
$tr.find('.upload_action').unbind('click').bind('click', removeFile);
}
} function uploadFailed() {
$tr.find('.upload_status').html('<a href="javascript:void(0);">×</a>');
$tr.find('.upload_status a').unbind('click').bind('click', function() {
$tr.remove();
});
$tr.find('.upload_action a').html('重试');
$tr.find('.upload_action a').unbind('click').bind('click', function() {
xhr.send(fd);
});
} function uploadCanceled() {
$tr.remove();
} function removeFile() {
$tr.remove();
if (typeof opt.fnRemove == 'function') {
opt.fnRemove(file.name);
}
} xhr.send(fd);
}, false);
});
};
}(jQuery));

5.代码查看地址:https://github.com/kencery/Common/tree/master/KenceryCommonMethod/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0

利用Jquery使用HTML5的FormData属性实现对文件的上传的更多相关文章

  1. 使用HTML5 FormData对象实现大文件分块上传(断点上传)功能

    FormData是HTML5新增的一个对象,通过FormData对象可以组装一组用 XMLHttpRequest发送请求的键/值对.它可以更灵活方便的发送表单数据,因为可以独立于表单使用.如果你把表单 ...

  2. Html5 突破微信限制实现大文件分割上传

    先来前端代码 <!DOCTYPE html> <html> <head> <meta name="viewport" content=&q ...

  3. 后端springmvc,前端html5的FormData实现文件断点上传

    前言 最近项目中有使用到文件断点上传,得空便总结总结,顺便记录一下,毕竟“好记性不如烂笔头”. 后端代码: package com.test.controller; import java.io.Bu ...

  4. 基于HTML5的可预览多图片Ajax上传

    一.关于图片上传什么什么的 在XHTML的时代,我们使用HTML file控件上传图片一次只能上传一张.要一次上传多图,做法是借助于flash.例如swfupload.js.可惜,使用复杂的点,比如f ...

  5. HTML5实现图片文件异步上传

    原文:HTML5实现图片文件异步上传 利用HTML5的新特点做文件异步上传非常简单方便,本文主要展示JS部分,html结构.下面的代码并未使用第三发库,如果有参照,请注意一些未展现出来的代码片段.我这 ...

  6. b/s利用webuploader实现超大文件分片上传、断点续传

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  7. 前端利用webuploader实现超大文件分片上传、断点续传

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  8. HTML5+J2EE实现文件异步上传

    P.S. HTML5经过了W3C的8年努力,终于正式推广了.这次升级最大的就是升级了XMLHTTPRequest,让它变成了XMLHTTPRequest Level II(这有啥奇怪的?).这个对象现 ...

  9. jQuery+php实现ajax文件即时上传

    很多项目中需要用到即时上传功能,比如,选择本地图片后,立即上传并显示图像.本文结合实例讲解如何使用jQuery和PHP实现Ajax即时上传文件的功能,用户只需选择本地图片确定后即实现上传,并显示上传进 ...

随机推荐

  1. jqgrid单元格中增加按钮

    1.增加列配置 { label: '问题数据', name: 'action', width: 80, align: 'center' } 2.函数 gridComplete: function () ...

  2. centos6.5 尝试下用 yum 安装 oddo

    我们要安装PostgreSQL,因为OpenERP使用PostgreSQL作为它的数据库.要安装它,我们需要运行下面的命令. yum install postgresql postgresql-ser ...

  3. Outer Join Query Over Dblink Can Fail With ORA-904 (Doc ID 730256.1)

    Outer Join Query Over Dblink Can Fail With ORA-904 (Doc ID 730256.1) To Bottom Modified:03-May-2013T ...

  4. C++ CompletionPort(完成端口)示例

    ECHO客户端 #include <WINSOCK2.H> #include <stdio.h> #define SERVER_ADDRESS "127.0.0.1& ...

  5. xfire框架内部基本结构解析

    1 概述 xfire是webservice的一个实现框架,是apache旗下CXF的前身,是一个比较被广泛使用的webservice框架,网上有很多关于如何使用xfire或cxf的hello worl ...

  6. android手势创建及识别

    使用一些浏览器或者输入法应用时会有一些手势操作,还可以自定义手势.这些神奇的操作是怎么做的呢?这一篇重点记录手势的识别和创建.这篇的内容使用到的是android.gesture包,具体的例子参考的是S ...

  7. 我也想聊聊 OAuth 2.0 —— 基本概念

    这是一篇待在草稿箱半年之久的文章 连我自己都不知道我的草稿箱有多少未发布的文章了.这应该是我在上一家公司未解散之前写的,记得当时是要做一个开发者中心,很不幸. 今天,打开草稿箱有种莫名的伤感,看到这个 ...

  8. HT图形组件设计之道(二)

    上一篇我们自定义CPU和内存的展示界面效果,这篇我们将继续采用HT完成一个新任务:实现一个能进行展开和合并切换动作的刀闸控件.对于电力SCADA和工业控制等领域的人机交互界面常需要预定义一堆的行业标准 ...

  9. ASP.NET在不同情况下实现单点登陆(SSO)的方法

    第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web. ...

  10. SpringMVC——类型转换和格式化、数据校验、客户端显示错误消息

    在介绍类型转换和格式化之前,我首先来介绍 <mvc:annotation-driven />. 需要导入的 schema: xmlns:mvc="http://www.sprin ...