高山来客
随笔 - 11, 文章 - 0, 评论 - 84, 引用 - 11
数据加载中……
Asp.NET大文件上传组件开发总结(三)---处理文件内容
这一篇相对就要简单一些了,只需要确定对文件的处理思路和与Asp.NET页面信息的传递的问题。
.NET1.1中,Asp.NET将获取的请求内容放入到一个Byte[]类型中,但在Asp.NET2.0中,却将数据封装到一个类型为System.Web.HttpRawUploadedContent的对象中,在这个新对象中,有一个重要的属性:_file,这个属性的类型为TempFile。正好是这个类型提供了将请求内容保存到临时文件的功能。这些信息都可能通过Reflector工具反编译获得(所以啊,做.NET开发,这个工具是必备的)。
在HttpRequest类中,我们可以发现如下用于分析页面各控件值的代码:
private
MultipartContentElement[] GetMultipartContent()
{
if
(
this
._multipartContentElements
==
null
)
{
byte
[] multipartBoundary
=
this
.GetMultipartBoundary();
if
(multipartBoundary
==
null
)
{
return
new
MultipartContentElement[
0
];
}
HttpRawUploadedContent entireRawContent
=
this
.GetEntireRawContent();
if
(entireRawContent
==
null
)
{
return
new
MultipartContentElement[
0
];
}
this
._multipartContentElements
=
HttpMultipartContentTemplateParser.Parse(entireRawContent, entireRawContent.Length, multipartBoundary,
this
.ContentEncoding);
}
return
this
._multipartContentElements;
}
说了这么多,只是说明了一个问题:通过改变Asp.NET页面对象的属性值来向页面传送是比较麻烦的。所以我采取单件模式的设计思路。具体是,将获取的文件内容写入到磁盘文件;每次上传文件过程中,初始化一个会话标志,页面通过这个会话标志来提取这些文件信息。在系统中,定义了两个类用来处理这项工作:
类
UploadContext
用于封装文件信息。
类UploadContextFactory用于会话标志的管理。
在上传页面里,组件将在页面中注册一个名为
UploadID
的Hidden字段。存放一个GUID作为会话标识。这个标志会在文件上传时,出现在请求内容中,组件通过获取这个会话标志和文件内容,正确将文件保存到临时目录中,并将提取文件信息供页面使用。页面则根据Request["
UploadID
"]字段在
类UploadContextFactory
提取上传文件对应的会话标志,并获取文件信息。这样就实现了页面对文件内容的提取。
这样,要求在上传页面的Page_Load事件中,采用如下语句来初始化一个会话,并指定存放文件的目录。
UploadContext context
=
UploadContextFactory.InitUploadContext(
this
,
@"
c:\myupload\
"
);
在需要获取文件信息的地方:采用如果语句来获取:
UploadContext context
=
UploadContextFactory.GetUploadContext();
if
((context
!=
null
)
&&
(context.Status
==
uploadStatus.Complete))
{
context.SaveFile(file1.ClientID, Request.MapPath(
"
/myupload/
"
));
}
当然这里就存在一个问题是:会话标志过期及没有初始化标志上传文件时的处理(如不请求页面,而直接发送文件,这可能会在用户使用其它工具发送时出现)。这个问题暂时没有处理。
现在,上传的文件可以上传到服务器了,页面也可以获取上传的文件内容以作进一步处理,如限制文件类型、存放到数据库等。
感觉思路有点乱了,那就先写出来,我随后再来整理。
Tag标签:
Asp.NET
posted on 2008-05-14 15:09
巴山
阅读(1560)
评论(5)
编辑
收藏
评论
#1楼
回复
引用
查看
支持一下,不容易啊!
2008-05-14 17:21 |
阿一
#2楼
回复
引用
查看
关注中
一直想找些这方面的资料,来解决文件上传的安全。
非常感觉LZ的教程,让我学会了不少东西。
2008-05-14 20:20 |
clal
#3楼
回复
引用
能说说2.0中如何去掉请求头吗?
反射这一块还是刚开始学
下载了原码,在2.0中没有办法通过.
2008-05-15 21:14 |
学习.net技术 [未注册用户]
#4楼
回复
引用
能说说2.0中如何去掉请求头吗?
反射这一块还是刚开始学
下载了原码,在2.0中没有办法通过.
2008-05-15 21:14 |
学习.net技术 [未注册用户]
#5楼
回复
引用
查看
“通过改变Asp.NET页面对象的属性值来向页面传送是比较麻烦的”这句话不是很明白,我们平时传送是通过改变对象属性?希望指点
2008-06-18 22:50 |
stg609
新用户注册
刷新评论列表
标题
姓名
主页
Email
(博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
网站首页
新闻频道
社区
小组
博问
网摘
闪存
找找看
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-05-23 21:39 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索
相关链接:
最新IT新闻:
MySpace推自助广告平台MyAds
Facebook创始人:信息共享或存摩尔定律
微软承认Vista用户账户控制功能有问题
资本寒冬侵袭中国视频网站 营销春天或不远
金融风暴波及全球创业板 中国概念股难独善其身
Powered by:
博客园
Copyright © 巴山
导航
博客园
首页
新随笔
联系
订阅
管理
<
2008年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(1)
给我留言
查看留言
我的标签
Asp.NET
(6)
范型
(1)
C#
(1)
VS.NET宏
(1)
属性
(1)
源码
(1)
Excel
(1)
.NET
(1)
随笔档案
2008年5月 (11)
最新评论
1. re: 可以在没有安装Office的情况,使用.net代码操作Excel文件的代码
我也需要,给我也发一份吧,感激不尽!
--mike8785
2. re: Asp.NET大文件上传组件开发总结_NET2.0源码下载。
同样错误
发现点击上传按钮以后,弹出了进度条页面,然后进度条页面就消失了,文件也没有上传~
页面变成无法显示
不知道为什么出现这个情况
--weir55
3. re: 可以在没有安装Office的情况,使用.net代码操作Excel文件的代码
能不能发给我一份,最近为这个烦呢,谢谢!
--zbdess150@163.com
阅读排行榜
1. Asp.NET大文件上传开发总结(一)(3119)
2. Asp.NET大文件上传组件开发总结(五)---上传进度信息的显示(1932)
3. Asp.NET大文件上传组件开发总结(三)---处理文件内容(1560)
4. Asp.NET大文件上传组件开发总结(四)---封送数据给Asp.NET页面(1547)
5. Asp.NET大文件上传组件开发总结(二)---提取文件内容(1073)
评论排行榜
1. Asp.NET大文件上传开发总结(一)(21)
2. 可以在没有安装Office的情况,使用.net代码操作Excel文件的代码(18)
3. Asp.NET大文件上传组件开发总结_NET2.0源码下载。(12)
4. Asp.NET大文件上传组件开发总结(四)---封送数据给Asp.NET页面(8)
5. Asp.NET大文件上传组件开发总结(五)---上传进度信息的显示(6)