繁体   English   中英

下载离线版图片并显示在 xamarin forms

[英]Download offline version of images and display in xamarin forms

在我的应用程序中,我想编写一个“离线版本”的显示器。 也就是说,您可以提前决定下载图像和稍后的视频,然后在没有移动数据(由于网络覆盖)的情况下查看它们。

我使用步骤 1 ( Xamarin.Forms: How to download an Image, save it local and display it on screen? ) 下载文件。 第 2 步我不能使用,因为较大的文件超出了最大数据大小。 所以我使用 PCLStorage 并将文件保存在本地。

IFolder folder = FileSystem.Current.LocalStorage;
IFile file = await folder.CreateFileAsync(imageFileName, CreationCollisionOption.ReplaceExisting);
await file.WriteAllTextAsync(Convert.ToBase64String(imageAsBase64String));

现在我想再次显示图像,但无论我做什么,图像都不会显示。 我将图像源 URL 重写为本地文件。 无论仅使用“filename.jpg”还是“file:///data/user/0/com.xxx.yyy_app/files/filename.jpg”都不会显示图像。 但我什至无法检查图像是否正确下载,因为本地存储中的文件未显示在文件管理器中。 folder.CheckExistsAsync 表示该文件存在。

部分我得到这个错误:

  [0:] Image Loading: Error getting stream for file:///data/user/0/com.xxx.yyy_app/files/2_76_1.jpg: System.InvalidOperationException: 
An invalid request URI was provided. The request URI must either be an absolute URI or BaseAddress must be set.
  at System.Net.Http.HttpClient.PrepareRequestMessage (System.Net.Http.HttpRequestMessage request) [0x0008a] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.Http/src/System/Net/Http/HttpClient.cs:678 
  at System.Net.Http.HttpClient.SendAsync (System.Net.Http.HttpRequestMessage request, System.Net.Http.HttpCompletionOption completionOption, System.Threading.CancellationToken cancellationToken) [0x00020] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.Http/src/System/Net/Http/HttpClient.cs:437 
  at System.Net.Http.HttpClient.GetAsync (System.Uri requestUri, System.Net.Http.HttpCompletionOption completionOption, System.Threading.CancellationToken cancellationToken) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.Http/src/System/Net/Http/HttpClient.cs:311 
  at System.Net.Http.HttpClient.GetAsync (System.Uri requestUri, System.Threading.CancellationToken cancellationToken) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.Http/src/System/Net/Http/HttpClient.cs:299 
  at Xamarin.Forms.StreamWrapper.GetStreamAsync (System.Uri uri, System.Threading.CancellationToken cancellationToken, System.Net.Http.HttpClient client) [0x00011] in D:\a\1\s\Xamarin.Forms.Core\StreamWrapper.cs:99 
  at Xamarin.Forms.Forms+AndroidPlatformServices.GetStreamAsync (System.Uri uri, System.Threading.CancellationToken cancellationToken) [0x0003f] in D:\a\1\s\Xamarin.Forms.Platform.Android\Forms.cs:854 
  at Xamarin.Forms.UriImageSource.GetStreamAsync (System.Uri uri, System.Threading.CancellationToken cancellationToken) [0x000cf] in D:\a\1\s\Xamarin.Forms.Core\UriImageSource.cs:136 

长话短说:我想从本地文件系统下载图像并显示它。 我怎么做?

非常感谢您的帮助。

使用www.DeepL.com/Translator翻译(免费版)

我想从本地文件系统下载图像并显示它。 我怎么做?

正确的步骤

  1. 从远程 url 下载图像。

  2. 将其保存到本地磁盘。

  3. 通过路径(文件夹+文件名)获取 Steam 数据。

  4. 在图像上显示它。

此解决方案效果很好,但在您的场景中图像尺寸太大,因此我们只需将Xamarin.Essentials.Preferences替换为内置文件处理,因为后者可以处理大文件存储。

修改方法SaveToDiskGetFromDisk

string folder = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);

public static void SaveToDisk(string imageFileName, byte[] imageAsBase64String)
{  
    var fileName = Path.Combine(folder ,imageFileName);
    File.WriteAllText(fileName , Convert.ToBase64String(imageAsBase64String));
}

public static Xamarin.Forms.ImageSource GetFromDisk(string imageFileName)
{
    var fileName = Path.Combine(folder ,imageFileName);
    var imageAsBase64String = File.ReadAllText(fileName)
    return ImageSource.FromStream(() => new MemoryStream(Convert.FromBase64String(imageAsBase64String)));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM