下载离线版本的图像并以xamarin形式显示



在我的应用程序中,我想编程一个;脱机版本";显示器。也就是说,例如,您可以提前决定下载图像和稍后的视频,然后在没有移动数据的情况下观看(由于网络覆盖(。

我使用步骤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"没有显示图像。但我甚至无法检查映像是否正确下载,因为本地存储中的文件不会显示在文件管理器中。文件夹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:a1sXamarin.Forms.CoreStreamWrapper.cs:99 
at Xamarin.Forms.Forms+AndroidPlatformServices.GetStreamAsync (System.Uri uri, System.Threading.CancellationToken cancellationToken) [0x0003f] in D:a1sXamarin.Forms.Platform.AndroidForms.cs:854 
at Xamarin.Forms.UriImageSource.GetStreamAsync (System.Uri uri, System.Threading.CancellationToken cancellationToken) [0x000cf] in D:a1sXamarin.Forms.CoreUriImageSource.cs:136 

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

非常感谢你的帮助。

翻译:www.DeepL.com/Translator(免费版(

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

的正确步骤

  1. 从远程url下载图像。

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

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

  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)));
}

最新更新