如何从URL下载图像并将其保存到本地SQLite数据库

时间:2016-12-27 00:08:52

标签: c# sqlite xamarin xamarin.forms

在Xamarin中,如何从URL下载图像?

然后,如何将图像保存到设备上的本地SQLite数据库?

我的Xamarin.Forms应用程序目前在Xamarin Documentation之后使用spinner-component{ display:none; } router-outlet + spinner-component{ display: block; } 的{​​{1}}属性的URL,这很好用。但是,我注意到每次应用程序启动时,它都会通过网络重新下载此图像。我更喜欢从URL下载图像并将其本地保存到设备中;此方法将为用户节省电池和数据使用。

1 个答案:

答案 0 :(得分:4)

解释

要完成此操作,我们会使用byte[]将图片从网址下载为HttpClient,然后将其保存到我们的本地SQLite数据库。

示例应用

Here is a sample app使用Xamarin.Forms完成此任务。为了最好地理解,我建议从GitHub下载代码。

示例代码

从Url下载图片

我们将使用byte[]将图片下载为HttpClient。这样可以更容易地将它存储在我们的SQLite数据库中。

    const int _downloadImageTimeoutInSeconds = 15;
    readonly HttpClient _httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(_downloadImageTimeoutInSeconds) };

    async Task<byte[]> DownloadImageAsync(string imageUrl)
    {
        try
        {
            using (var httpResponse = await _httpClient.GetAsync(imageUrl))
            {
                if (httpResponse.StatusCode == HttpStatusCode.OK)
                {
                    return await httpResponse.Content.ReadAsByteArrayAsync();
                }
                else
                {
                    //Url is Invalid
                    return null;
                }
            }
         }
         catch (Exception e)
         {
             //Handle Exception
             return null;
         }
    }

将模型保存到数据库

将图像作为byte[]下载后,我们会将其存储在SQLite数据库中。

我已在下一部分中添加了有关该模型的更多信息。

public static async Task SaveDownloadedImage(DownloadedImageModel downloadedImage)
{
    var databaseConnection = await GetDatabaseConnectionAsync();
    await databaseConnection.InsertOrReplaceAsync(downloadedImage);
}

模型

在模型中,我创建了一个属性,将图像存储为字符串,以及将图像作为Xamarin.Forms.ImageSource返回的只读属性。

public class DownloadedImageModel
{
    [PrimaryKey]
    public string ImageUrl { get; set;}

    public byte[] DownloadedImageBlob { get; set; }

    public ImageSource DownloadedImageAsImageStreamFromBase64String
    {
        get
        {
            try
            {
                if (DownloadedImageBlob == null)
                    return null;

                var imageByteArray = DownloadedImageBlob;

                return ImageSource.FromStream(() => new MemoryStream(imageByteArray));
            }
            catch (Exception e)
            {
                Debug.WriteLine(e);
                return null;
            }
        }
    }
}