asp.net中对网络文件的读取及处理
2008-08-30 10:34
246 查看
最近做项目的时候,要求对音频文件做地址保护,找了一些资料,关于如果对地址做防盗链的处理还是比较多的,只是都是写好的组件,有些是开源的。但是根据项目要求,结合公司基础产品的情况,还是需要单独的来处理,就没有用那些组件。这就涉及到了对网络文件的读取。
很自然的会想到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里面怎么给出解释的:
![](http://images.cnblogs.com/cnblogs_com/huankfy/length.jpg)
我并没有从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();
}
增加了个计数器进行判断,最后一次读取的流就不会有‘杂质’了,得到的内容就是完整的文件内容,不会多出其它的东西。一切正常。
很自然的会想到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里面怎么给出解释的:
![](http://images.cnblogs.com/cnblogs_com/huankfy/length.jpg)
我并没有从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();
}
增加了个计数器进行判断,最后一次读取的流就不会有‘杂质’了,得到的内容就是完整的文件内容,不会多出其它的东西。一切正常。
相关文章推荐
- C#(asp.net )读取ASHX文件(一般处理程序)
- asp.net不同类型文件读取处理
- [网络收集]分析ASP.NET读取XML文件4种方法
- asp.net 2.0 读取 资源文件
- ASP.NET 2.0 读取配置文件[INI](示例代码下载)
- [网络收集]asp.net文件路径问题
- 关于C#和ASP.NET中对App.config和Web.config文件里的[appSettings]和[connectionStrings]节点进行新增、修改、删除和读取相关的操作
- ASP.NET CORE入门之读取Json配置文件
- ASP.NET读取Excel文件的一些当时不懂的东西
- asp.net处理大文件上传
- ASP.NET中上传并读取Excel文件数据,附后生成EXCEL及杀掉EXCEL进程。
- asp.net 读取一个文本文件,并输出到网页显示 通过 一般处理程序实现
- Asp.net异步文件读写并发处理总结
- ASP.NET读取XML文件4种方法
- 将后台数据读取到前台的EXCEL文件中去,用javascript实现,asp.net,javacript(发一个原创)
- Asp.Net_文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- asp.net如何读取局域网内文件啊?
- ASP.Net操作Excel(下)_上传读取文件
- asp.net读取资源文件的另一种用法
- asp.net关于文件在数据库的存入和读取