首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用webclient下载文件,将其保存为gif类型的图像,并使用存储流来报告进度?

如何使用webclient下载文件,将其保存为gif类型的图像,并使用存储流来报告进度?
EN

Stack Overflow用户
提问于 2021-11-03 18:18:29
回答 1查看 29关注 0票数 0
代码语言:javascript
运行
复制
private async Task DownloadAsync()
        {
            using (var client = new WebClient())
            {
                client.DownloadFileCompleted += (s, e) =>
                {
                    if (e.Error == null)
                    {
                        urlsCounter--;

                        var t = urls;

                        if (urlsCounter == 0)
                        {
                            CheckIfImagesExist();

                            btnRadarPath.Enabled = true;
                            btnSatellitePath.Enabled = true;

                            radCounter = 0;
                            satCounter = 0;

                            lblStatus.Text = "Completed.";

                            dates = rad.dates;
                            var images = System.IO.Directory.GetFiles(radarFolderImagesDownload,
                                  "*.gif", SearchOption.AllDirectories).OrderBy(x => x).ToArray();

                            Array.Sort(images, new MyComparer(false));

                            if (images.Length > 0)
                            {
                                for (int i = 0; i < images.Length; i++)
                                {
                                    drawOnImage.DrawText(dates[i].ToString("ddd, dd MMM yyy HH':'mm"), images[i]);
                                }
                            }

                            GetImagesFiles();
                        }
                    }
                    else
                    {
                        string error = e.Error.ToString();
                    }
                };

                client.DownloadProgressChanged += (s, e) => tracker.SetProgress(e.BytesReceived, e.TotalBytesToReceive);
                client.DownloadProgressChanged += (s, e) => lblAmount.Text = tracker.SizeSuffix(e.BytesReceived) + "/" + tracker.SizeSuffix(e.TotalBytesToReceive);
                client.DownloadProgressChanged += (s, e) => lblSpeed.Text = tracker.GetBytesPerSecondString();
                client.DownloadProgressChanged += (s, e) => myLong = Convert.ToInt64(client.ResponseHeaders["Content-Length"]);
                client.DownloadProgressChanged += (s, e) =>
                {
                    progressBar1.Value = e.ProgressPercentage;
                    label1.Text = e.ProgressPercentage + "%";
                };

                for (int i = 0; i < urls.Count; i++)
                {
                    tracker.NewFile();

                    if (urls[i].Contains("Radar"))
                    {
                        await client.DownloadFileTaskAsync(new Uri(urls[i]), radarFolderImagesDownload + "\\image" + radCounter + ".gif");

                        radCounter++;
                    }
                    else
                    {
                        using (MemoryStream ms = new MemoryStream(client.DownloadData(new Uri(urls[i]))))
                        {
                            Image img = Image.FromStream(ms, true);
                            img.Save(satelliteFolderImagesDownload + "\\image" + satCounter + ".gif", System.Drawing.Imaging.ImageFormat.Gif);
                        }

                        satCounter++;
                    }
                }
            }
        }

它下载一切都很好,但当它下载卫星图像部分时:

代码语言:javascript
运行
复制
using (MemoryStream ms = new MemoryStream(client.DownloadData(new Uri(urls[i]))))
                            {
                                Image img = Image.FromStream(ms, true);
                                img.Save(satelliteFolderImagesDownload + "\\image" + satCounter + ".gif", System.Drawing.Imaging.ImageFormat.Gif);
                            }
    
                            satCounter++;

它没有像以前那样报告进度。

在我下载这张图片之前,它和雷达部分一样:

代码语言:javascript
运行
复制
await Client.DownloadFileTaskAsync(new Uri(urls[i]), fNameSat);

但是,因为我想在下载卫星图像时将其保存为gif格式,所以我使用了now memorystream和image.save,这样可以避免向progressBar和所有其他client.DownloadProgressChanged事件报告进度

我如何让它使用memorystream并将它们保存为gif并不断报告进度?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-03 20:57:28

试试这个:

代码语言:javascript
运行
复制
List<string> Urls = new List<string>();

Urls.Add("a url");
Urls.Add("another url");

for(int i = 0; i < Urls.Count; i++)
{
   System.Net.WebClient WC = new System.Net.WebClient();

   WC.DownloadFileAsync(new Uri(Urls[i]), @"The location you want to save the file...");
   WC.DownloadFileCompleted += (s, e) =>
   {
      progressBar1.Value += progressBar1.Maximum / Urls.Count;
   };
}

这将下载列表中的所有urls。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69829886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档