在 Xamarin Forms 中下载带有进度条的文件

Posted

技术标签:

【中文标题】在 Xamarin Forms 中下载带有进度条的文件【英文标题】:Download file with progress bar in Xamarin Forms 【发布时间】:2015-08-18 13:32:33 【问题描述】:

我正在尝试使用下载进度条在 Xamarin Forms(PCL,因此 WebClient 不可用)中创建一个下载页面。我使用了来自 Xamarin 的以下信息,但没有成功:

http://developer.xamarin.com/recipes/ios/network/web_requests/download_a_file/ http://developer.xamarin.com/recipes/cross-platform/networking/download_progress/

这是我当前的代码(带有工作进度条):

using System;
using System.Collections.Generic;

using Xamarin.Forms;
using System.Net.Http;
using System.IO;
using System.Threading.Tasks;

namespace DownloadExample

    public partial class DownloadPage : ContentPage
    
        public DownloadPage ()
        
            InitializeComponent ();

            DownloadFile("https://upload.wikimedia.org/wikipedia/commons/3/3d/LARGE_elevation.jpg");
        

        private async Task<long> DownloadFile(string url)
        
            long receivedBytes = 0;
            long totalBytes = 0;
            HttpClient client = new HttpClient ();

            using (var stream = await client.GetStreamAsync(url)) 
                byte[] buffer = new byte[4096];
                totalBytes = stream.Length;

                for (;;) 
                    int bytesRead = await stream.ReadAsync (buffer, 0, buffer.Length);
                    if (bytesRead == 0) 
                        await Task.Yield ();
                        break;
                    

                    receivedBytes += bytesRead;

                    int received = unchecked((int)receivedBytes);
                    int total = unchecked((int)totalBytes);

                    double percentage = ((float) received) / total;

                    progressBar1.Progress = percentage;
                
            

            return receivedBytes;
        
    

现在,我需要将文件保存到本地存储。但是,在此示例中,我没有获取文件内容,因此无法将其写入本地存储。我需要在代码中进行哪些更改才能实现这一点?

仅供参考:在此示例中,我正在下载一个图像,但它将是一个 .pdf / .doc / .docx 的特征。

提前致谢。

BR、FG

【问题讨论】:

How to implement progress reporting for Portable HttpClient 的可能副本 你能分享你是如何保存文件的以及你是如何连接缓冲区的吗?... 【参考方案1】:

想想你的文章,我也解决了下载文件

WebClient client = new WebClient();
using (var stream = await client.OpenReadTaskAsync(Download point))

   using (MemoryStream ms = new MemoryStream())
   
        var buffer = new byte[BufferSize];
        int read = 0;
        totalBytes = Int32.Parse(client.ResponseHeaders[HttpResponseHeader.ContentLength]);

       while ((read = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
        
           ms.Write(buffer, 0, read);//important : receive every buffer
           receivedBytes += read;
           received = unchecked((int)receivedBytes);
           total = unchecked((int)totalBytes);

           percentage = ((float)received) / total;
           progressBar1.Progress = percentage;
           labProg.Text = AppResources.MsgDownloadprogress + Math.Truncate(percentage * 100).ToString() + "%";
        //END while
        Stream ALLstream = new MemoryStream(ms.ToArray());//important change Stream
        App.APK.GenApkFile(ALLstream);//change APK file and save memory of phone
     //END using (MemoryStream
  stream.Close();
//END using (var stream

【讨论】:

【参考方案2】:

您实际上将文件内容复制到 for 循环内的 buffer 中。将每次运行该循环的buffer 内容连接到一个新的byte[] fileContentBuffer 中,您可以访问可以保存在本地存储中的内容。

【讨论】:

以上是关于在 Xamarin Forms 中下载带有进度条的文件的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms的ActivityIndicator和ProgressBar比较

C# 自定义控件(圆形进度条) Xamarin Forms

在 Xamarin.Forms 中具有两个带有数字的选择列的选择器

在每个 TableViewcell 中播放带有进度条的音频

在 Xamarin.forms C# 中显示带有 JSON 数据的列表

带有图像和圆形进度条的圆形按钮