asp.net中对网络文件的读取及处理
来源:互联网 发布:淘宝商家入驻协议 编辑:程序博客网 时间:2024/05/17 07:09
最近做项目的时候,要求对音频文件做地址保护,找了一些资料,关于如果对地址做防盗链的处理还是比较多的,只是都是写好的组件,有些是开源的。但是根据项目要求,结合公司基础产品的情况,还是需要单独的来处理,就没有用那些组件。这就涉及到了对网络文件的读取。
很自然的会想到HttpWebRequest和HttpWebResponse,不错,我也正是这么处理的。看看第一个版本:
- private static byte[] getFileStream(string fileUrl) {
- HttpWebRequest request = WebRequest.Create(fileUrl) as HttpWebRequest;
- HttpWebResponse response = null;
- MemoryStream msstream=new MemoryStream();
- byte []buffer=new byte[1024];
- if (request != null){
- try{
- response = request.GetResponse() as HttpWebResponse;
- if (response != null){
- if (response.StatusCode == HttpStatusCode.OK){
- Stream ms = response.GetResponseStream();
- while (ms.Read(buffer, 0, buffer.Length) > 0)
- msstream.Write(buffer, 0, buffer.Length);
- }
- }
- }
- catch (Exception ex){
- ex.Message.ToString();
- }
- finally{
- response.Close();
- }
- }
- return msstream.GetBuffer();
- }
问题就出在发出请求后,得到的文件大小与实际的文件大小不一样,变大了。跟踪调试后,问题:
1)跟踪调试,得到的结果是做了两次请求,但是并没有弹出两个下载文件对话框出来,而是只有一个。
2)ms的内容长度与最后得到的msstream的长度是不一致的。
对问题1很容易解决,问题2是怎么造成的?这才是真正的关键所在。当最后ms的内容长度小于所要读取的长度的时候,问题就出现了,buffer里面的内容有‘杂质’了,写进msstream里面的内容自然就不对了。直接用ms.Length做判断不就可以了,为什么要用上面的方式进行读取?那就先看看ms.Length在msdn里面怎么给出解释的:
我并没有从Stream里面继承一个新类,而是直接用的Stream,length属性是用不了的(其它需要在继承类里面实现的熟悉也是一样)。换个思路:
- static byte[] getInternetFileContent(string fileUlr){
- HttpWebRequest request = null;
- HttpWebResponse response = null;
- MemoryStream msstream = new MemoryStream();
- try{
- request = WebRequest.Create(fileUlr) as HttpWebRequest;
- response = request.GetResponse() as HttpWebResponse;
- if (response != null){
- if (response.StatusCode == HttpStatusCode.OK){
- Stream ms = response.GetResponseStream();
- long len = response.ContentLength;
- byte[] buffer = new byte[1024];
- long counter = 1024;
- long mod = len % counter;
- while (len / counter > 0){
- len -= counter;
- msstream.Write(buffer, 0, buffer.Length);
- }
- ms.Read(buffer, 0, (int)mod);
- msstream.Write(buffer, 0, (int)mod);
- }
- }
- }
- catch (Exception ex){
- System.Diagnostics.Trace.Write(ex.Message);
- }
- finally{
- request = null;
- response = null;
- }
- return msstream.GetBuffer();
- }
增加了个计数器进行判断,最后一次读取的流就不会有‘杂质’了,得到的内容就是完整的文件内容,不会多出其它的东西。一切正常。
- asp.net中对网络文件的读取及处理
- ASP.Net中对时间的处理
- ASP.Net中对时间的处理
- asp.net对数据库中图片的上传与读取
- asp.net对数据库中图片的上传与读取
- asp.net中对xml的读取,写入,删除
- asp.net中对文件的创建,移动,复制,及删除操作
- asp.net中对文件的创建,移动,复制,及删除操作
- ASP.NET读取目录及文件
- ASP.Net中对时间的格式化处理
- ASP.NET中Application_Error对Exception的集中处理
- ASP.NET母版页中对控件ID的处理
- ASP.NET中读取Excel文件数据
- 在asp.net中读取XML文件
- 在asp.net中读取XML文件
- ASP.NET的页面中对其他文件的引用
- asp.net中对XML文件的简单操作
- asp.net中 对访问文件报错的解决方法
- 多多关照!
- gpresult命令
- 自定义的随机小数写法
- 逛CSDN找来的代码
- Secedit:命令行下操作组策略找工具
- asp.net中对网络文件的读取及处理
- 基于GZipStream的多文件压缩组件TGZipCompressBar实现
- HomeR2初步实施。
- 设计Qt风格的C++的应用程序接口。
- 人生抛物线
- ipseccmd:命令行更改IP安全策略工具
- 关于Homer2项目的一些介绍
- my notebook
- http://www.java2000.net/p8560