在Xamarin中,如何从URL下载图像?
然后,如何将图像保存到设备上的本地SQLite数据库?
我的Xamarin.Forms应用程序目前在Xamarin Documentation之后使用spinner-component{
display:none;
}
router-outlet + spinner-component{
display: block;
}
的{{1}}属性的URL,这很好用。但是,我注意到每次应用程序启动时,它都会通过网络重新下载此图像。我更喜欢从URL下载图像并将其本地保存到设备中;此方法将为用户节省电池和数据使用。
答案 0 :(得分:4)
要完成此操作,我们会使用byte[]
将图片从网址下载为HttpClient
,然后将其保存到我们的本地SQLite数据库。
Here is a sample app使用Xamarin.Forms完成此任务。为了最好地理解,我建议从GitHub下载代码。
我们将使用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;
}
}
}
}