簡體   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