通过httpWebResponse下载文件

luxin10 2011-12-13 11:18:06
通过HttpWebRequest和HttpWebResponse下载文件时,出现问题,代码如下,哪里错了?

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strUrl2);
request.Method = "GET";
request.Credentials = CredentialCache.DefaultCredentials;
request.AddRange(0);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
long totle = response.ContentLength;

using (FileStream fileStream = File.Create(@"D:\qweqwe.doc"))
{
long createdSize = 0;
byte[] buffer = new byte[4096];
while (createdSize < totle)
{
int bufferSize = (totle - createdSize) < 4096 ? (int)(totle - createdSize) : 4096;
fileStream.Write(buffer, 0, bufferSize);
createdSize += bufferSize;
}
}

MessageBox.Show(totle.ToString());
long down = 0;
using (FileStream fileStream = new FileStream(@"D:\qweqwe.doc", FileMode.Open))
{
Stream stream = response.GetResponseStream();
for (long i = 0; i < totle / 1024; i++)
{
byte[] temp = new byte[1024];
stream.Read(temp, 0, 1024);
fileStream.Seek(down, SeekOrigin.Begin);
fileStream.Write(temp, 0, 1024);
down += 1024;
}
}
...全文
353 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
luxin10 2011-12-13
  • 打赏
  • 举报
回复
 
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strUrl2);
request.Method = "GET";
request.Credentials = CredentialCache.DefaultCredentials;
request.AddRange(0);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
long totle = response.ContentLength;

根据地址使用request请求需要下载的文件,得到返回的response,totle表示响应的流的总字节长度

using (FileStream fileStream = File.Create(@"D:\qweqwe.doc"))
{
long createdSize = 0;
byte[] buffer = new byte[4096];
while (createdSize < totle)
{
int bufferSize = (totle - createdSize) < 4096 ? (int)(totle - createdSize) : 4096;
fileStream.Write(buffer, 0, bufferSize);
createdSize += bufferSize;
}
}

根据总字节长度在磁盘上创建一个大小和请求的服务器上文件大小相同的空文件;

long down = 0;
using (FileStream fileStream = new FileStream(@"D:\qweqwe.doc", FileMode.Open))
{
Stream stream = response.GetResponseStream();
for (long i = 0; i < totle / 1024; i++)
{
byte[] temp = new byte[1024];
stream.Read(temp, 0, 1024);
fileStream.Seek(down, SeekOrigin.Begin);
fileStream.Write(temp, 0, 1024);
down += 1024;
}
}

读response的响应流,将读取得到的流写入第二步中创建的文件;
机器人 2011-12-13
  • 打赏
  • 举报
回复
出什么错误了?

看上面的代码,你可以直接用 (new WebClient()).DownloadFile(...) 来做。

另外不懂,你GET的时候,File.Create 什么。。。
luxin10 2011-12-13
  • 打赏
  • 举报
回复
没有任何错误信息,代码能正常跑完,但是下载下来的文件无法打开,应该是在流操作的时候,要么请求的流错了,要么在写入的时候将流写错了;
jiuhexuan 2011-12-13
  • 打赏
  • 举报
回复
你吧错误信息贴上,错误堆栈信息
qwertxp 2011-12-13
  • 打赏
  • 举报
回复
什么玩意那么复杂,Response.WriteFile不就行了。
阿非 2011-12-13
  • 打赏
  • 举报
回复
乱码的话 查看编码
luxin10 2011-12-13
  • 打赏
  • 举报
回复
代码执行过程没有任何错误,但是下载下来的文件无法正确打开,或者打开后显示的是乱码
KGallery 2011-12-13
  • 打赏
  • 举报
回复
不如直接WebClient.DownloadFile()
又方便又好
阿非 2011-12-13
  • 打赏
  • 举报
回复
什么错误
luxin10 2011-12-13
  • 打赏
  • 举报
回复
如果需要显示下载的进度或者使用多线程下载文件。。。
机器人 2011-12-13
  • 打赏
  • 举报
回复
有这个必要嘛...

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧