爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 2944|回复: 1

求大神解答疑惑:C# DownloadFile 批量下载天气在线网站图片 无法打开

[复制链接]

新浪微博达人勋

发表于 2017-11-27 12:20:20 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本人想用C#编写一个批量下载一些天气网站上的数值产品图片的小程序,界面如下:
搜狗截图17年11月29日1027_1.png
思路就是循环写出各个网站图片的url(各大网站的图片命名都是规律性很强的),然后依次下载
使用的方法主要就是:
WebClient webClient = new WebClient();
webClient.DownloadFile(t7PicUrl_full, t7PathAndName);

目前,对于其他的网站,如欧格、CCTV等都可以顺利实现,唯独对于天气在线网站,下载的图片都是不超过1kb的文件,无法打开。
但是我用C#的控制台应用程序(传说中的黑窗口)手动循环下载,就可以成功下载下来,把代码移植到窗体里就不行了,也没有报任何错。
另外还有一点,我编写了一个判断网站上某张图片是否存在的函数,对其他网站都适用,唯独对天气在线不好使,无论网站是否有这张图片,返回都是有。

请教大神:出现不超过1kb的文件是怎么回事?是否跟天气在线网站的某种安全设置有关(防止短时间频繁访问)?为什么我便的那个函数对天气在线不好使?
判断网络文件是否存在的代码:
private static bool RemoteFileExists(string fileUrl)//判断网络文件是否存在
        {
            bool result = false;//下载结果
            WebResponse response = null;
            try
            {
                WebRequest req = WebRequest.Create(fileUrl);
                req.Timeout = 180000;
                response = req.GetResponse();
                result = response == null ? false : true;
            }
            catch (Exception ex)
            {
                result = false;
            }
            finally
            {
                if (response != null) response.Close();
            }

            return result;
        }


循环下载天气在线网站的代码
private void btn_t7AllDown_Click(object sender, EventArgs e)
        {
            string strBeginTime = t7Year + "-" + t7Month + "-" + t7Day + " " + t7Hour + ":00:00";//t7Year、t7Month、 t7Day、t7Hour是起报时间,已在前文赋值, 此处略。
            DateTime datBeginTime = Convert.ToDateTime(strBeginTime);
            int SJJG = 6;//网站图片的时间间隔
            int t7PicSum = t7Long/SJJG;//每一项的图片数目
            //遍历所有选中的checkbox,开始下载
            foreach (Control temp in groupBox1.Controls)
            {
                if (temp is CheckBox && ((CheckBox)temp).Checked == true)
                {
                    try//下载被选中的内容
                    {
                        int k = 0;
                        string t7PicType = ((CheckBox)temp).Name;//我把图片文件的类型写到了CheckBox.Name里,如z500 z850等
                        string t7Path = MainPath + "/天气在线@UTC" + t7Day + "日" + t7Hour + "时起报/" + ((CheckBox)temp).Tag;
                        if (!Directory.Exists(t7Path))
                        {
                            Directory.CreateDirectory(t7Path);
                        }
                        if(t7PicType=="z500"||t7PicType=="z850")
                        {
                            SJJG=12;//z500 z850都是隔12小时一张图,因此需要别更改一下
                            t7PicSum=t7Long/SJJG;
                        }
                        for (int i = SJJG ; i <= t7Long; i = i + SJJG)
                        {
                            DateTime datSJXH = datBeginTime.AddHours(i);//时间循环
                            string strSJXH = datSJXH.ToString("yyMMddHH");
                            string t7Name = t7PicType + "_" + strSJXH + "_" + t7Day + t7Hour + ".gif";
                            string t7PicUrl_full = t7PicUrl_front + t7Year + "/" + t7Month + "/" + t7Day + "/basis" + t7Hour + "/cncn/" + t7Name + "?";
                            string t7PathAndName = t7Path + "/" + t7Name;
                            //if (RemoteFileExists(t7PicUrl_full))
                            //{
                                if (File.Exists(t7PathAndName))//判断本地文件是否已存在,避免重复下载
                                {
                                }
                                else
                                {
                                    //Thread.Sleep(5000);
                                    WebClient webClient = new WebClient();
                                    webClient.DownloadFile(t7PicUrl_full, t7PathAndName);//下载文件
                                    //MessageBox.Show(t7PicUrl_full);
                                }
                                k++;
                                foreach (Control temp0 in groupBox1.Controls)
                                {
                                    if (temp0 is TextBox && ((TextBox)temp0).TabIndex == temp.TabIndex)
                                        ((TextBox)temp0).Text = k.ToString() + "/" + t7PicSum.ToString();//进度条上的数字,标识“已下张数/预计张数”
                                    if (temp0 is ProgressBar && ((ProgressBar)temp0).TabIndex == temp.TabIndex)
                                    {
                                        ((ProgressBar)temp0).Minimum = 0;
                                        ((ProgressBar)temp0).Maximum = t7PicSum;//进度条
                                        ((ProgressBar)temp0).Value = k;
                                    }
                                    Application.DoEvents();
                                }
                            //}
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("t7-" + temp.Text + ":" + ex.Message);
                    }
                }
            }

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-12-15 21:49:49 | 显示全部楼层

回帖奖励 +1 金钱

楼主创意很好,
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表