HTTP下载文件

HTTP下载文件

/// <summary>
/// Http方式下载文件
/// </summary>
/// <param name="url">http地址</param>
/// <param name="savepath">本地文件</param>
/// <returns></returns>
public bool Download(string url, string savepath)
{
bool res = false;
long startPosition = 0; // 上次下载的文件起始位置
FileStream writeStream; // 写入本地文件流对象

// 判断要下载的文件夹是否存在
if (File.Exists(savepath))
{
writeStream = File.OpenWrite(savepath); // 存在则打开要下载的文件
startPosition = writeStream.Length; // 获取已经下载的长度,可以结合"HTTP_HEAD获取文件长度"这篇文章算出下载进度百分比
writeStream.Seek(startPosition, SeekOrigin.Current); // 本地文件写入位置定位
}
else
{
writeStream = new FileStream(savepath, FileMode.Create); // 创建一个文件
}

try
{
HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url); // 打开网络连接

if (startPosition != 0)
{
myRequest.AddRange((int)startPosition); // 设置Range值,与上面的writeStream.Seek用意相同,是为了定义远程文件读取位置
}

Stream readStream = myRequest.GetResponse().GetResponseStream(); // 向服务器请求,获得服务器的回应数据流

byte[] btArray = new byte[512]; // 定义一个字节数据,用来向readStream读取内容和向writeStream写入内容
int contentSize = readStream.Read(btArray, 0, btArray.Length); // 尝试读取文件

while (contentSize > 0) // 如果读取长度大于零则续连成功,继续下载
{
writeStream.Write(btArray, 0, contentSize); // 写入本地文件
contentSize = readStream.Read(btArray, 0, btArray.Length); // 继续向远程文件读取
}

//关闭流
writeStream.Close();
readStream.Close();

res = true; //返回true下载成功
}
catch (Exception)
{
writeStream.Close();
res = false; //返回false下载失败
}

return res;
}
文章作者: NiTian
文章链接: https://www.nitian1207.top/2019/08/02/HTTP下载文件/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 NiTian的小窝
支付宝打赏
微信打赏