在我的應用程式中,我想撰寫一個“離線版本”的顯示幕。也就是說,您可以提前決定下載影像和稍后的視頻,然后在沒有移動資料(由于網路覆寫)的情況下查看它們。
我使用第 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翻譯(免費版)
uj5u.com熱心網友回復:
我想從本地檔案系統下載影像并顯示它。我怎么做?
正確的步驟
從遠程 url 下載影像。
將其保存到本地磁盤。
通過路徑(檔案夾 檔案名)獲取 Steam 資料。
在 Image 上顯示它。
這個解決方案效果很好,但是在你的場景中影像尺寸太大的區別,所以我們只需要用Xamarin.Essentials.Preferences內置的檔案處理替換,因為后者可以處理大檔案存盤。
修改方法SaveToDisk和GetFromDisk。
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)));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/415472.html
標籤:
