C# winform带进度条的图片下载
代码如下:
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
} private void FrmMain_Load(object sender, EventArgs e)
{
btnDownload.FlatStyle = FlatStyle.Flat;
btnDownload.FlatAppearance.BorderSize = 0;
btnDownload.FlatAppearance.MouseOverBackColor = Color.LightSkyBlue;
btnDownload.FlatAppearance.MouseDownBackColor = Color.SkyBlue;
txtWebSiteUrl.Focus();
cmbRegexs.Items.AddRange(new string[]
{
"--请选择正确的正则表达式--",
"<img\\s+src=\"(.+)\"\\s+/>",
"<img\\s+src=\"(.+)\"\\s+border=\".+\"\\s+hspace=\".+\"\\s+smallsrc=\".+\"\\s+/>",
"<img\\s+src=\"(.+)\"\\s+alt=\"(.+)?\"\\s+style=\"(.+)?\"/>"
});
cmbRegexs.SelectedIndex = 0;
btnDownload.Click += new EventHandler(btnDownload_Click);
} void btnDownload_Click(object sender, EventArgs e)
{
try
{
string url = txtWebSiteUrl.Text.Trim();//网址
string regex = cmbRegexs.SelectedItem.ToString();//正则表达式 #region 基本信息验证 if (string.IsNullOrEmpty(url) || !Regex.IsMatch(url, "[a-zA-z]+://[^\\s]*", RegexOptions.ECMAScript)) { txtWebSiteUrl.Text = ""; txtWebSiteUrl.Focus(); /*提示太烦了,所以就定位*/ return; }
if (regex == "--请选择正确的正则表达式--") { MessageBox.Show("请选择正则表达式"); return; } #endregion string lofter_code = GetWebCode(url, Encoding.UTF8);//获取网页内容
MatchCollection matchcollection = Regex.Matches(lofter_code, regex);//查询匹配项
if (matchcollection.Count <= 0)
throw new Exception("该网页没有图片"); string Directory = string.Empty;//保存的文件夹 #region 获取文件夹路径 FolderBrowserDialog folder = new FolderBrowserDialog();//文件夹选择
folder.RootFolder = Environment.SpecialFolder.DesktopDirectory;//默认位置为桌面
folder.ShowNewFolderButton = true;//可以新建文件夹
if (folder.ShowDialog() == DialogResult.OK)
{
Directory = folder.SelectedPath;
btnDownload.Enabled = false; txtWebSiteUrl.Enabled = false; cmbRegexs.Enabled = false;/*禁用按钮和文本和下拉框*/
}
else return; #endregion int i = 0;
WebClient wc = new WebClient();
wc.Encoding = Encoding.UTF8;
foreach (Match item in matchcollection)
{
i++;
DownloadFile(item.Groups[1].Value, Path.Combine(Directory, GetPictureName(item.Groups[1].Value)), pbProgressBar);//不是很卡
//wc.DownloadFileAsync(item.Groups[1].Value, Path.Combine(Directory, GetPictureName(item.Groups[1].Value)));//速度快,但无法设置进度条,并且很卡
lblResult.Text = "还有【" + (matchcollection.Count - i) + "】张图片未下载";
}
lblResult.Text = "下载完成,共下载【" + matchcollection.Count + "】张图片";
btnDownload.Enabled = true; txtWebSiteUrl.Enabled = true; cmbRegexs.Enabled = true;/*启用按钮和文本和下拉框*/
}
catch (Exception ex)
{
btnDownload.Enabled = true; txtWebSiteUrl.Enabled = true; cmbRegexs.Enabled = true;/*启用按钮和文本和下拉框*/
lblResult.Text = "错误:" + ex.Message;
} } /// <summary>
/// 下载文件
/// </summary>
/// <param name="url">下载文件地址</param>
/// <param name="filename">下载后的存放地址</param>
/// <param name="prog">用于显示的进度条</param>
public static void DownloadFile(string url, string filename, System.Windows.Forms.ProgressBar prog)
{
try
{
System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);
System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();
long totalBytes = myrp.ContentLength;
if (prog != null)
{
prog.Maximum = (int)totalBytes;
}
System.IO.Stream st = myrp.GetResponseStream();
System.IO.Stream so = new System.IO.FileStream(filename, System.IO.FileMode.Create);
long totalDownloadedByte = 0;
byte[] by = new byte[1024];
int osize = st.Read(by, 0, (int)by.Length);
while (osize > 0)
{
totalDownloadedByte = osize + totalDownloadedByte;
System.Windows.Forms.Application.DoEvents();
so.Write(by, 0, osize);
if (prog != null)
{
prog.Value = (int)totalDownloadedByte;
}
osize = st.Read(by, 0, (int)by.Length);
}
so.Close();
st.Close();
}
catch (System.Exception ex)
{
throw new Exception(ex.Message);
}
} /// <summary>
/// 获取指定网页的内容
/// </summary>
/// <param name="path">网页地址</param>
/// <param name="encoding">字符编码格式</param>
/// <returns></returns>
public static string GetWebCode(string path, Encoding encoding)
{
System.Net.WebRequest wr = System.Net.WebRequest.Create(path);
System.IO.Stream s = wr.GetResponse().GetResponseStream();
if (s == null) return null;
System.IO.StreamReader sr = new System.IO.StreamReader(s, encoding);
string all = sr.ReadToEnd();//读取网站的数据
sr.Close();
s.Close();
return all;
} /// <summary>
/// 获取图片名
/// </summary>
/// <param name="url">图片地址</param>
/// <returns></returns>
public static string GetPictureName(string url)
{
return url.Remove(0, url.LastIndexOf('/') + 1);
}
C# winform带进度条的图片下载的更多相关文章
- 基于jQuery带进度条全屏图片轮播代码
基于jQuery带进度条全屏图片轮播代码.这是一款基于jQuery实现的oppo手机官网首页带进度条全屏图片轮播特效.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div ...
- HTML5多图片拖拽上传带进度条
前言 昨天利用css2的clip属性实现了网页进度条觉得还不错,但是很多情况下,我们在那些时候用进度条呢,一般网页加载的时候如果有需要可以用,那么问题就来了,怎么才算整个加载完毕呢,是页面主要模块加载 ...
- Android -- 自定义带进度条的按钮
1. 实现了一个带进度条的按钮,完成后显示提示信息,并设置按钮为不可再次被点击
- PHP+ajaxForm异步带进度条上传文件实例
在使用ajaxForm方法之前,首先需要安装form.js的插件,网上有: 一.首先说用法,ajaxForm可以接收0或1个参数,该参数可以是一个变量.一个对象或回调函数,这个对象主要有以下参数: v ...
- 【Web】前端文件上传,带进度条
最近做项目发现,在文件上传的过程中,增加进度条,能大大改善用户体验.本例介绍带进度条的文件上传 环境搭建 参考:[Java]JavaWeb文件上传和下载. 原生ajax上传带进度条 <%@ pa ...
- Asp.Net上传大文件带进度条swfupload
Asp.Net基于swfupload上传大文件带进度条百分比显示,漂亮大气上档次,大文件无压力,先看效果 一.上传效果图 1.上传前界面:图片不喜欢可以自己换 2.上传中界面:百分比显示 3.上传后返 ...
- servlet多文件上传(带进度条)
需要commons-fileupload-1.3.jar和commons-io-2.4.jar的支持 页面效果:(图片文件都可以) (1)进度标识类 public class UploadStatus ...
- 赞!带进度条的 jQuery 文件拖放上传插件
jQuery File Uploader 是一个 jQuery 文件拖放上传插件,包括 Ajax 上传和进度条效果.作者编写这个插件的想法是要保持它非常简单,不像其他的插件,很多的标记,并提供一些 H ...
- atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7
atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7 1. 实现原理 1 2. 大的文件上传原理::使用applet 1 3. 新的bp 2 1. 性能提升---分割小文件上传 ...
随机推荐
- Oracle 11g XML java连接
在网上找了好多教程 走好好多弯路 现在从头总结下 oralce11g 可以直接用xmltype节点存储xml文件 简单来说就是直接存一个文件进去 首先安装oracle11g 网上教程非常多 然后进Ne ...
- ORACLE创建OEM是老爱报的错误【weber出品】
还是采用静默安装,手工建库完成后.在安装的OEM的时候一直报这个错误.这里稍微记载以下解决方案: Database connection through listener failed. Fix th ...
- Oracle数据库中的blob类型解析
Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须 ...
- C语言转义字符相关知识
在C语言里所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示.而C中定义了一些字母或数字前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称 ...
- POJ 3273 Monthly Expense(二分查找+边界条件)
POJ 3273 Monthly Expense 此题与POJ3258有点类似,一开始把判断条件写错了,wa了两次,二分查找可以有以下两种: ){ mid=(lb+ub)/; if(C(mid)< ...
- poi实现Excel导出
最近做了一个导出Excel的小功能,以前没接触过,现在分享下自己的代码,想让各位帮忙看看有啥地方可以优化,也方便自己以后查阅... 首先是excelAction的代码: /** * excelActi ...
- SQL约束脚本的用法
1.主键约束:要对一个列加主键约束的话,这列就必须要满足的条件就是分空因为主键约束:就是对一个列进行了约束,约束为(非空.不重复)以下是代码 要对一个列加主键,列名为id,表名为emp 格式为:a ...
- IE6、火狐不支持a:visited
今天做个样式,想让超链接点击后变成灰色,可发现IE里是没问题,可火狐就全灰色的.我测试了好几遍,发现不是顺序的问题.当然可以在火狐里地址栏里输入about:config.可总不能让用户去那里改吧.以下 ...
- php中urlencode使用
URLEncode的方式一般有两种,一种是传统的基于GB2312的Encode(Baidu.Yisou等使用),另一种是基于UTF-8的Encode(Google.Yahoo等使用). 本工具分别实现 ...
- angularjs学习笔记—事件指令
ngClick 适用标签:所有触发条件:单击 #html <div ng-controller="LearnCtrl"> <div ng-click=" ...