随笔 - 268  文章 - 0  评论 - 1028  阅读 - 160万

asp.net3.5关于FileUpload控件的一个注意点的思考

   最近在一个asp.net 3.5项目中需要用到FileUpload控件读取文本文件中的内容。我们正常的思路就是通过FileUpload控件选取文件,后台读取FileUpload控件显示的绝对路径,最后文件类操作绝对路径下的文件。但是在选择文本文件的时候,意外发现取不到文件的完整路径,只能取到文件名(ie8和firefox3.0都一样)。印象中asp.net2.0里要取文件完整路径,只要UpLoadFile.PostedFile.FileName就可以了,但是现在为什么会只取到文件名呢?我大胆猜测可能是asp.net3.5下的一个bug。然后google一下,终于找到一篇比较靠谱的文章,也就是这篇。然后我满怀信心地按照它给出的解决方法即Path.GetFileName(UpLoadFile.PostedFile.FileName)这样的方法跟踪调试了一下,我靠,文件路径竟然还是错的。为什么是错的呢?我选择桌面的一个文本文件,然后后台取的竟然将vs2008的d盘下的安装文件Common7文件夹下面的一段路径给取出来了(你可以亲自试试看)。无语了,又google一阵无果后,得,换成html上传控件,麻利地写了几行JavaScript代码,问题这次总算可以完美解决了吧,一调试,真是不敢相信啊,嗯...又发现一个新问题(可以查看这一篇文章,“fakepath”替代了具体某个盘符下的文件夹路径)。通过这两篇文章,我们发现它们都是一致性的建立在浏览器的分析基础之上,这本来无可厚非,而且按照第二篇文章的方法,设置好浏览器的安全选项后,问题确实解决了。但是我们还不满足,如果普通用户不知道浏览器的设置怎么办,或者知道需要设置浏览器安全性但是因为其他外在因素考虑放弃设置怎么办?难道要加说明,让每个用户在上传文件的时候都必须来修改自己的浏览器的设置?显然不可取。其实我们还有一种变通的方式(针对服务器控件而言),很简单,只要使用上传控件的FileBytes属性,如下:
 byte[] data = this.fuControl.FileBytes; //fuControl 上传控件
接着将二进制数组转换成我们需要的字符串就行了
string txtContent = System.Text.Encoding.GetEncoding("GB2312").GetString(data, 0, data.Length); //二进制数组转化为字符串 
ps:这个转换笔者只试过文本文件从二进制转为字符串,其他类型的文件没有试过。如果你要读取其他类型的文件内容,但是二进制文件无法直接转换为您需要的形式,请慎重使用本文的方法。
posted on   JeffWong  阅读(1210)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
< 2009年10月 >
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

I know how to make it works and I want to know how it works.
点击右上角即可分享
微信分享提示