asp.net+js 实现无刷新上传解析csv文件的代码


Posted in Javascript onMay 17, 2010

前阵子工作中用到,贴上代码,仅保留上传有关的代码,发现code其实很少。
上传页面html/js

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
<title></title> 
<script type="text/javascript"> 
function FinishUpload(filePath) { 
document.getElementById("uploadForm").reset(); 
if (!filePath) { 
alert("Import Failed!"); 
} 
else { 
alert("Imported Successfully to " + decodeURIComponent(filePath) + "!"); 
} 
} 
function UploadFile() { 
var arr = document.getElementById("txtFile").value.split('.'); 
var fileType = arr[arr.length - 1]; 
if (fileType.toLowerCase().indexOf("csv") < 0) { 
document.getElementById("uploadForm").reset(); 
alert("Please select a csv file."); 
return false; 
} 
document.getElementById("uploadForm").encoding = "multipart/form-data"; 
document.getElementById("uploadForm").submit(); 
} 
function ResetFile(file) { 
var tmpForm = document.createElement('form'); 
file.parentNode.insertBefore(tmpForm, file); 
tmpForm.appendChild(file); 
tmpForm.reset(); 
tmpForm.removeNode(false); 
} 
</script> 
</head> 
<body> 
<form id="uploadForm" name="uploadForm" action="Upload.ashx" method="post" target="hidIframe" enctype="multipart/form-data"> 
<table cellpadding='0' cellspacing='0' style="width:100%;height:100%;border-collapse:collapse;" border="0" > 
<tr> 
<td> 
<input id="txtFile" name="txtFile" type="file" style="border:solid 1px Gray;" /> 
<iframe name="hidIframe" id="hidIframe" style="display:none;" ></iframe> 
</td> 
</tr> 
<tr> 
<td> 
<input type="button" id="btnImportOK" value="Upload" onclick="UploadFile();" /> 
<input type="button" id="btnImportCancel" onclick="ResetFile(document.getElementById('txtFile'))" value="Reset"/> 
</td> 
</tr> 
</table> 
</form> 
</body> 
</html>

 
处理文件上传的c#
if (context.Request.Files.Count > 0) 
{ 
HttpPostedFile file = context.Request.Files[0]; 
if (file.ContentLength > 0) 
{ 
string title = string.Empty; 
title = DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + Path.GetFileName(file.FileName); 
string path = "./Upload/" + title; 
path = System.Web.HttpContext.Current.Server.MapPath(path); 
file.SaveAs(path); 
context.Response.Write("<script>window.parent.FinishUpload('" + HttpUtility.UrlEncode(path) + "');</script>"); 
} 
} 
else 
{ 
context.Response.Write("<script>window.parent.FinishUpload('');</script>"); 
}

做到无刷新,基本原理就是:通过表单提交到iframe里,从而使刷新发生在iframe里。form设置action指向处理上传的文件,target指向iframe。上传操作的结果可以返回到iframe里,调用父对象的FinishUpload方法显示是否上传成功。所以在AJAX未流行时,常用这种方法来伪装未刷新的效果,现在仍然可以使用。
要注意的是:
enctype="multipart/form-data"不可少,enctype默认编码是“application/x-www-form-urlencoded”,设置enctype="multipart/form-data",用于二进制方式上传文件。
为防止文件名乱码,防止乱七八糟字符URL传递中出现问题,返回文件名到前台时进行HttpUtility.UrlEncode,在前台JS中取文件名时进行decodeURIComponent。
重置文件选择框时,要把文件选择框临时插入到临时表单,通过表单的reset方法重置。
顺便贴上解析上传的csv文件的code
解析csv文件

private DataTable ImportDataTable(string filepath) 
{ 
DataTable mydt = new DataTable("myTableName"); 
mydt.Columns.Add("Data ID", System.Type.GetType("System.String")); 
mydt.Columns.Add("Field Name", System.Type.GetType("System.String")); 
mydt.Columns.Add("New Value", System.Type.GetType("System.String")); 
DataRow mydr; 
using (System.IO.StreamReader mysr = new System.IO.StreamReader(filepath)) 
{ 
int data; 
char current; 
StringBuilder text = new StringBuilder(); 
IDictionary<int, List<string>> results = new Dictionary<int, List<string>>(); 
bool isInYinHao = false; ; 
int lineId = 1; 
int index = 0; 
while (true) 
{ 
data = mysr.Read(); 
if (data != -1) 
{ 
current = (char)data; 
if (current == '"') 
{ 
if (isInYinHao) 
{ 
isInYinHao = false; 
} 
else 
{ 
if (index > 0) 
{ 
text.Append(current); 
} 
isInYinHao = true; 
} 
} 
else if (current == ',') 
{ 
if (isInYinHao) 
{ 
text.Append(current); 
} 
else 
{ 
SaveResult(results, lineId, text); 
index = 0; 
continue; 
} 
} 
else if (current == '\r') 
{ 
if (isInYinHao) 
{ 
text.Append(current); 
} 
} 
else if (current == '\n') 
{ 
if (isInYinHao) 
{ 
text.Append(current); 
} 
else 
{ 
SaveResult(results, lineId, text); 
index = 0; 
lineId++; 
continue; 
} 
} 
else if (current == '\0') 
{ 
} 
else 
{ 
text.Append(current); 
} 
index++; 
} 
else 
{ 
//Read to file end. 
SaveResult(results, lineId, text); 
break; 
} 
} 
foreach (int id in results.Keys) 
{ 
mydr = mydt.NewRow(); 
for (int i = 0; i < results[id].Count; i++) 
{ 
if (i > 2) 
{ 
break; 
} 
mydr[i] = results[id][i]; 
} 
mydt.Rows.Add(mydr); 
} 
} 
return mydt; 
} 
private void SaveResult(IDictionary<int, List<string>> results, int lineId, StringBuilder text) 
{ 
if (!results.ContainsKey(lineId)) 
{ 
results.Add(lineId, new List<string>()); 
} 
results[lineId].Add(text.ToString()); 
text.Remove(0, text.Length); 
}

点击下载
Javascript 相关文章推荐
js 数组实现一个类似ruby的迭代器
Oct 27 Javascript
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
Jun 28 Javascript
客户端js性能优化小技巧整理
Nov 05 Javascript
JavaScript获取多个数组的交集简单实例
Nov 11 Javascript
js语法学习之判断一个对象是否为数组
May 13 Javascript
javascript学习笔记(二)数组和对象部分
Sep 30 Javascript
jQuery实现鼠标划过展示大图的方法
Mar 09 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
May 22 Javascript
Bootstrap 树控件使用经验分享(图文解说)
Nov 06 Javascript
Vue响应式原理Observer、Dep、Watcher理解
Jun 06 Javascript
Node.js系列之连接DB的方法(3)
Aug 30 Javascript
JS document form表单元素操作完整示例
Jan 13 Javascript
JQuery中的ready函数冲突的解决方法
May 17 #Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
May 17 #Javascript
jQuery 学习第六课 实现一个Ajax的TreeView
May 17 #Javascript
jQuery 学习第五课 Ajax 使用说明
May 17 #Javascript
jQuery实现的立体文字渐变效果
May 17 #Javascript
jQuery实现的类flash菜单效果代码
May 17 #Javascript
Jquery Select操作方法集合脚本之家特别版
May 17 #Javascript
You might like
我的论坛源代码(九)
2006/10/09 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
JS原型对象通俗&quot;唱法&quot;
2012/12/27 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
js中this用法实例详解
2015/05/05 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
AngularJS 支付倒计时功能实现思路
2017/06/05 Javascript
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
Vue 莹石摄像头直播视频实例代码
2018/08/31 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
浅谈numpy数组的几种排序方式
2017/12/15 Python
详解python中的 is 操作符
2017/12/26 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
Python语言异常处理测试过程解析
2020/01/08 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
美国从事品牌鞋类零售的连锁店:Famous Footwear
2016/08/25 全球购物
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
公司领导推荐信
2013/11/12 职场文书
社团招新策划书
2014/02/04 职场文书
物控部经理职务说明书
2014/02/25 职场文书
就业推荐表自我鉴定
2014/03/21 职场文书
小学班主任评语大全
2014/04/23 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server
Java 多线程并发FutureTask
2022/06/28 Java/Android