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 客户端和服务器端的格式转换
Aug 27 Javascript
mysql输出数据赋给js变量报unterminated string literal错误原因
May 22 Javascript
JavaScript中的对象的extensible属性介绍
Dec 30 Javascript
javascript中AJAX用法实例分析
Jan 30 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
Jun 01 Javascript
RequireJS简易绘图程序开发
Oct 28 Javascript
原生JS仿QQ阅读点击展开、收起效果
Mar 08 Javascript
JQuery常见节点操作实例分析
May 15 jQuery
vue项目中将element-ui table表格写成组件的实现代码
Jun 12 Javascript
微信小程序顶部导航栏可滑动并选中放大
Dec 05 Javascript
Vue项目接入Paypal实现示例详解
Jun 04 Javascript
CocosCreator入门教程之网络通信
Apr 16 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 fsockopen伪造post与get方法的详解
2013/06/14 PHP
php解析字符串里所有URL地址的方法
2015/04/03 PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
2015/12/02 PHP
微信支付开发交易通知实例
2016/07/12 PHP
javascript add event remove event
2008/04/07 Javascript
javascript不同页面传值的改进版
2008/09/30 Javascript
js 分栏效果实现代码
2009/08/29 Javascript
this和执行上下文实现代码
2010/07/01 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
2011/08/15 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
js实现点击添加一个input节点
2014/12/05 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
javascript实现用户点击数量统计
2016/12/25 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
2017/03/15 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
python小技巧之批量抓取美女图片
2014/06/06 Python
python计算对角线有理函数插值的方法
2015/05/07 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
简单了解python元组tuple相关原理
2019/12/02 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
2020/01/23 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
《日月潭》教学反思
2014/02/28 职场文书
决心书范文
2014/03/11 职场文书
中班开学寄语
2014/04/04 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
初中语文教师研修日志
2015/11/13 职场文书
mysql分组后合并显示一个字段的多条数据方式
2022/01/22 MySQL