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 相关文章推荐
JSON JQUERY模板实现说明
Jul 03 Javascript
在Windows上安装Node.js模块的方法
Sep 25 Javascript
js/jquery获取文本框输入焦点的方法
Mar 04 Javascript
Node.js connect ECONNREFUSED错误解决办法
Sep 15 Javascript
将form表单通过ajax实现无刷新提交的简单实例
Oct 12 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
Nov 22 Javascript
详解vue渲染从后台获取的json数据
Jul 06 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
Jan 23 jQuery
Bootstrap Table 双击、单击行获取该行及全表内容
Aug 31 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
Dec 21 Javascript
js的Object.assign用法示例分析
Mar 05 Javascript
在Vue中实现随hash改变响应菜单高亮
Mar 09 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
也谈php网站在线人数统计
2008/04/09 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
Yii2中关联查询简单用法示例
2016/08/10 PHP
javascript delete 使用示例代码
2010/03/29 Javascript
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
JS实现电商放大镜效果
2017/08/24 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
Vue发布订阅模式实现过程图解
2020/04/30 Javascript
Python实现的HTTP并发测试完整示例
2020/04/23 Python
python不换行之end=与逗号的意思及用途
2017/11/21 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
Python实现简单的语音识别系统
2017/12/13 Python
深入浅析Python传值与传址
2018/07/10 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
一套VC试题
2015/01/23 面试题
SQL语言面试题
2013/08/27 面试题
传播学毕业生求职信
2013/10/11 职场文书
会计电算化专业个人的自我评价
2013/11/24 职场文书
《黄河颂》教学反思
2014/02/07 职场文书
《每逢佳节倍思亲》教后反思
2014/04/19 职场文书
环境保护标语
2014/06/20 职场文书
开会通知短信大全
2015/04/20 职场文书
家长会开场白和结束语
2015/05/29 职场文书
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript
python垃圾回收机制原理分析
2022/04/13 Python