利用HttpWebRequest和HttpWebResponse下载文件的问题,请路过的兄弟姐妹帮忙一下!

yjyb 2005-11-09 07:40:39
这是我写的下载类
using System;
using System.Net;
using System.IO;

namespace FengYu.FileDownload
{
public class Downloader
{
private const int downloadBlockSize = 1024;
public void DownloadFile()
{
if (this.fileLocalPath == null)
return;
try
{
// create the download buffer
byte[] buffer = new byte[downloadBlockSize];
int readCount;
// read a block of bytes and get the number of bytes read
while((int)(readCount = DownloadStream.Read(buffer, 0, downloadBlockSize)) > 0)
{
// save block to end of file
SaveToFile(buffer, readCount, this.fileLocalPath);
// update total bytes read
totalDownloaded += readCount;
}
}
finally
{
if( response != null)
response.Close();
this.isFileDownload = true;
}
// return true;
}

//将数据流保存到本地文件
private void SaveToFile(byte[] buffer, int count, string fileName)
{
FileStream f = null;

try
{
f = File.Open(fileName, FileMode.Append, FileAccess.Write);
f.Write(buffer, 0, count);
}
finally
{
if(f != null)
f.Close();
}
}

public void Connect()
{
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(this.url);
response = (HttpWebResponse) request.GetResponse();
if (response.StatusCode == HttpStatusCode.NotFound )
{
this.isFileExist = false;
return ;
}
if (response.StatusCode == HttpStatusCode.OK)
{
fileSize = response.ContentLength;
fileLastModifyInInternet = response.LastModified;
this.isFileExist = true;
}
}
private long fileSize; //文件大小
private string fileLocalPath; //文件本地路径
private DateTime fileLastModifyOnLocal; //本地最后修改时间
private DateTime fileLastModifyInInternet; //网上最后修改时间
private HttpWebResponse response;
private Stream stream; //取得返回流
private long start; //文件中下载点
private bool isFileExist; //网络中文件是否存在?
private bool isFileDownload; //文件是否下载完成?
private string url; //文件的网络地址
private long totalDownloaded; //已下载的数据量

#region //定义属性
public Stream DownloadStream
{
get
{
if(this.start == this.fileSize)
return Stream.Null;
if(this.stream == null)
this.stream = this.response.GetResponseStream();
return this.stream;
}
}

public long TotalDownloaded
{
get
{
return this.totalDownloaded;
}
}
public string FileLocalPath //本地文件路径
{
set
{
this.fileLocalPath = value;
}
get
{
return this.fileLocalPath;
}
}
public string Url //下载文件的网络地址
{
set
{
this.url = value;
}
get
{
return this.url;
}
}
public bool IsFileExist //互联网上文件是否存在?
{
get
{
return this.isFileExist;
}
}
public bool IsFileDownload //文件是否已下载完成
{
get
{
return this.isFileDownload;
}
}
public long FileSize //文件大小
{
get
{
return this.fileSize ;
}
}
public DateTime FileLastModifyOnLocal //本地中文件最近下载的时间
{
set
{
this.fileLastModifyOnLocal = value;
}
get
{
return this.fileLastModifyOnLocal ;
}
}
public DateTime FileLastModifyInInternet //互联网中文件最近修改的时间
{
get
{
return this.fileLastModifyInInternet ;
}
}
#endregion

public void Close()
{
this.response.Close();
}
}
}
下面是调用类的窗体的主要代码:
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private Thread mythread;

private void Download_Click(object sender, System.EventArgs e)
{


FileOne.FileLocalPath = LocalPathOfFile.Text;
FileOne.Url = UrlOfFile.Text;
FileOne.Connect();
if (FileOne.IsFileExist == false)
return;
progressBarDownload.Minimum = 0;
progressBarDownload.Maximum = (int)FileOne.FileSize;
timer1.Enabled = true;
txtBoxMessage.Text = FileOne.FileSize.ToString();
mythread = new Thread(new ThreadStart(FileOne.DownloadFile));
mythread.Start();

}
private Downloader FileOne = new Downloader();
private void timer1_Tick(object sender, System.EventArgs e)
{
if (FileOne.IsFileDownload == true)
{
txtBoxMessage.Text += "下载已完成!";
timer1.Stop();
}
long percentD ;
percentD = FileOne.TotalDownloaded * 100/FileOne.FileSize;
labelDownloadPercent.Text = percentD.ToString() + "%";
progressBarDownload.Value = (int)FileOne.TotalDownloaded;
}
1、上面的代码下载几百k的文件的时候没有什么问题,但是在天极网下载文件(如http://dl1.mydown.com/soft1/200507/FlashFXP_3.2.0.1080_SC.exe)的时候却屡屡出错,编译环境提示 “while((int)(readCount = DownloadStream.Read(buffer, 0, downloadBlockSize)) > 0)”超时等待,估计是网络堵塞的原因。不知各位兄弟姐妹有何解决方法?
2、在下载天空软件上的文件时(如http://conut.skycn.com/softdownload.php?id=15809&url=http://jsyz.driversky.com/down/eMule-0.46c-VeryCD0913Install.exe,实际用的url是http://jsyz.driversky.com/down/eMule-0.46c-VeryCD0913Install.exe)返回的文件大小只有4720字节,这是不是因为地址转向造成的,如何解决?
...全文
502 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
addwing 2006-06-07
  • 打赏
  • 举报
回复
帮你顶!
kyle315 2006-06-06
  • 打赏
  • 举报
回复
我也碰到类似的问题,下载其他的文件没有问题,但是下载扩展名为.cs,.vb(.net的文件)总是出问题,但是更改他们的扩展名后就可以正常下载,望大虾解决。
dreadknightll 2006-02-18
  • 打赏
  • 举报
回复
学习学习
dolfen 2006-02-17
  • 打赏
  • 举报
回复
正研究着。。。先帮你顶
Qqwwee_Com 2006-02-15
  • 打赏
  • 举报
回复

请参考我尾巴后面的软件
有源代码的。



====CSDN 小助手 V2.5 2005年11月05日发布====
CSDN小助手是一款脱离浏览器也可以访问Csdn论坛的软件
界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/11/05/523395.aspx
下载:http://szlawbook.com/csdnv2

oboaixoaix 2005-12-25
  • 打赏
  • 举报
回复
好,up
yjyb 2005-11-23
  • 打赏
  • 举报
回复
唉,怎么没有人过来帮忙看一下啊!
yjyb 2005-11-10
  • 打赏
  • 举报
回复
路过的兄弟姐妹帮忙看看撒!谢谢拉!
yjyb 2005-11-09
  • 打赏
  • 举报
回复
to cw888() :
我看了您的代码,感觉读起来有些困难,可能是初学的缘故,如果可以,再多给点代码和说明好吗?
cw888 2005-11-09
  • 打赏
  • 举报
回复
你看看我作过的部分代码:你可能要超时处理吧
public override HttpWebResponse GetResponse(string id)
{
TraceEx.Debug("IN");

string uri = this.OriginalUri;
TraceEx.Debug("OriginalUri: ", uri);
TraceEx.Debug("id: ", id);

if (!SplittingProp.RegexHost.IsMatch(this.Host))
{
ErrorCode ec = new Service_ParamInvalidValue(new ArgumentOutOfRangeException("Host", ErrorMessage.ERROR_HOST_OUT_OF_RANGE),
MINOR_CODE + 01);
AppErrorException aee = new AppErrorException(ec, PackageName.PACKAGENAME_SPLITTING,
ErrorMessage.ERROR_HOST_OUT_OF_RANGE, " Host[", this.Host, "]");
throw aee;
}

HttpWebRequest netReq = null;
try
{
netReq = (HttpWebRequest) HttpWebRequest.Create(uri);
}
catch (UriFormatException ex)
{
ErrorCode ec = new Service_DataFormatError(ex, MINOR_CODE + 02);
AppErrorException aee = new AppErrorException(ec, PackageName.PACKAGENAME_SPLITTING,
ErrorMessage.ERROR_URI_FORMAT_ERROR, " Uri[", uri, "]");
throw aee;
}

netReq.Method = SplConst.HTTP_POST;
netReq.ConnectionGroupName = id;
SetHeader(netReq);

string strProxy = SplittingProp.UrlProxy;
if (strProxy.Length != 0)
{
TraceEx.Debug("Proxy:", strProxy);
netReq.Proxy = new WebProxy(strProxy);
}


Stream stream = netReq.GetRequestStream();
stream.Write(Body, 0, Body.Length);
stream.Close();

HttpWebResponse netResp = null;
try
{
netResp = (HttpWebResponse) netReq.GetResponse();
}
catch (WebException we)
{
if (we.Response != null)
{
TraceEx.Warn(PackageName.PACKAGENAME_SPLITTING, "->", ErrorMessage.WARN_ERROR_RESPONSE_RETURN, " Ignored.", " : StatusCode[",
we.Status, "]", " Message[",we.Message,"]");
netResp = (HttpWebResponse) we.Response;
//we.Response.Close();
}
else
{
ErrorCode ec = new Service_CommunicateFail(we, MINOR_CODE + 03);
AppErrorException aee = new AppErrorException(ec, PackageName.PACKAGENAME_SPLITTING,
ErrorMessage.ERROR_GETRESPONSE_ERROR, " Uri[", uri,"]");
throw aee;
}
}
TraceEx.Debug("OUT");
return netResp;
}
yjyb 2005-11-09
  • 打赏
  • 举报
回复
谢谢楼上帮忙up。
对于问题1,并不是所有情况都会造成 超时,提示 超时 时,文件的下载完成率也不一定,有出现过30%多、50%多等等,最近的一次尝试下载就在现在,居然下载成功了!
所以估计,不成功的原因和网络堵塞程度有很大关系,但是如何在网络状况不好的情况下也能完全下载呢,请大家帮忙。谢谢!
Qqwwee_Com 2005-11-09
  • 打赏
  • 举报
回复
标记一下。




====CSDN 小助手 V2.5 2005年11月05日发布====
CSDN小助手是一款脱离浏览器也可以访问Csdn论坛的软件
界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/11/05/523395.aspx
下载:http://szlawbook.com/csdnv2

源码下载地址: https://pan.quark.cn/s/8d2c461c797c JavaWeb程序设计构成了掌握Web交互式应用程序开发的核心领域,对于初学者来说,精通这一技术具有决定性意义。在“JavaWeb程序设计(第三版)作业答案”中,我们可以预期获得针对该教材习题的一系列深入解析,从而协助学习者强化知识体系。 JavaWeb所包含的技术组件涵盖了Servlet、JSP(JavaServer Pages)、JDBC(Java Database Connectivity)以及各类框架如Spring MVC、Struts等。Servlet是Java平台提供的一种扩展服务器功能的接口,能够处理HTTP求并生成相应的反馈。JSP则是一种用于构建动态网页的工具,它支持开发者将HTML代码与Java代码进行整合编写,从而简化了Web应用程序的开发流程。 作业答案通常会涉及以下几个核心内容: 1. **Servlet基础**:可能包含Servlet生命周期、init(), service(), destroy()方法的应用,以及如何在web.xml文件中设定Servlet的映射关系。 2. **JSP基础**:JSP的九大内置对象,如request、response、session、application等的使用,以及EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)的实际操作。 3. **HTTP协议理解**:GET和POST求方法的差异,求头与响应头的应用,以及会话管理的概念阐释。 4. **JDBC数据库操作**:与数据库建立连接,执行SQL指令,处理查询结果集,以及...
源码链接: https://pan.quark.cn/s/a4b39357ea24 斐讯K2是一款广受用户青睐的无线路由器,其运行表现稳定且具备较高的可操作性,在DIY爱好者群体中拥有极高的声誉。本资料将系统性地阐述斐讯K2的固件刷机方法及其关联的技术要点。固件升级是路由器爱好者改善设备性能、扩展功能的一种普遍手段,经由替换出厂固件,能够达成更加个性化的网络配置、增强安全防护等目标。斐讯K2固件资源库涵盖了多种知名的非官方固件,诸如Tomato Pheonix 不死鸟、高恪、PandoraBox 潘多拉等,这些固件均具备独特的优势,能够适配不同用户的需求。 1. Tomato Pheonix 不死鸟:Tomato是一款立足于Linux的开源固件,以其精巧、高效而备受推崇。不死鸟版本是专门为华硕及斐讯路由器优化的分支,提供了卓越的QoS(服务质量)配置、详尽的图表监控以及便捷的固件升级途径。对于那些需要精准调控带宽和监测网络状态的用户而言,这是一个理想的选项。 2. 高恪:高恪固件是OpenWrt的定制化版本,着重于操作的便捷性和运行的可靠性,特别适合对路由器操作不甚熟悉的用户群体。它提供了一些实用的功能,例如内置的广告屏蔽、快速测速工具等,同时保留了OpenWrt的适应性。 3. PandoraBox 潘多拉:潘多拉盒是另一款基于OpenWrt的固件,它以丰富的插件库和强大的自定义潜力而闻名。用户能够依据个人需求安装各类插件,实现更多功能,如远程接入、DDNS(动态域名解析服务)等。 4. 官方固件的纯净版本与定制版本:官方固件通常更侧重于稳定性,纯净版意味着未预置额外的应用或服务,适合注重稳定性的用户。定制版则可能包含了制造商的特色功能或优...

111,130

社区成员

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

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

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