首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Xamarin-Forms下载图像并将其保存在本地存储中。

如何使用Xamarin-Forms下载图像并将其保存在本地存储中。
EN

Stack Overflow用户
提问于 2018-06-26 16:25:26
回答 3查看 15.6K关注 0票数 11

我想下载一个图像并将其存储在本地存储中的特定文件夹中。

我正在用这个下载图片:

代码语言:javascript
复制
var imageData = await AzureStorage.GetFileAsync(ContainerType.Image, uploadedFilename);
var img = ImageSource.FromStream(() => new MemoryStream(imageData));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-26 18:36:56

创建FileService接口

在共享代码中,创建一个新接口,例如,名为IFileService.cs

代码语言:javascript
复制
 public interface IFileService
 {
      void SavePicture(string name, Stream data, string location="temp");
 }

实现Android

在你的android项目中,创建一个名为"Fileservice.cs“的新类。

确保它派生自之前创建的接口,并使用依赖关系信息对其进行修饰:

代码语言:javascript
复制
[assembly: Dependency(typeof(FileService))]
namespace MyApp.Droid
{
    public class FileService : IFileService
    {
        public void SavePicture(string name, Stream data, string location = "temp")
        {
            var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
            documentsPath = Path.Combine(documentsPath, "Orders", location);
            Directory.CreateDirectory(documentsPath);

            string filePath = Path.Combine(documentsPath, name);

            byte[] bArray = new byte[data.Length];
            using (FileStream fs = new FileStream(filePath , FileMode.OpenOrCreate))
            {
                using (data)
                {
                    data.Read(bArray, 0, (int)data.Length);
                }
                int length = bArray.Length;
                fs.Write(bArray, 0, length);
            }
        }
    }
}

Implementation iOS iOS的实现基本相同:

代码语言:javascript
复制
[assembly: Dependency(typeof(FileService))]
namespace MyApp.iOS
{
    public class FileService: IFileService
    {
        public void SavePicture(string name, Stream data, string location = "temp")
        {
            var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
            documentsPath = Path.Combine(documentsPath, "Orders", location);
            Directory.CreateDirectory(documentsPath);

            string filePath = Path.Combine(documentsPath, name);

            byte[] bArray = new byte[data.Length];
            using (FileStream fs = new FileStream(filePath , FileMode.OpenOrCreate))
            {
                using (data)
                {
                    data.Read(bArray, 0, (int)data.Length);
                }
                int length = bArray.Length;
                fs.Write(bArray, 0, length);
            }
        }
    }
}

为了保存您的文件,在您的共享代码中,调用

代码语言:javascript
复制
DependencyService.Get<IFileService>().SavePicture("ImageName.jpg", imageData, "imagesFolder");

应该可以走了。

票数 23
EN

Stack Overflow用户

发布于 2018-06-26 18:18:02

代码语言:javascript
复制
public void DownloadImage(string URL)
{
    var webClient = new WebClient();
    webClient.DownloadDataCompleted += (s, e) =>
    {
        byte[] bytes = new byte[e.Result.Length];
        bytes=e.Result; // get the downloaded data
        string documentsPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures).AbsolutePath;

        var partedURL = URL.Split('/');
        string localFilename = partedURL[partedURL.Length-1];
        string localPath = System.IO.Path.Combine(documentsPath, localFilename);
        File.WriteAllBytes(localPath, bytes); // writes to local storage
        Application.Current.MainPage.IsBusy = false;
        Application.Current.MainPage.DisplayAlert("Download", "Download Finished", "OK");
        MediaScannerConnection.ScanFile(Forms.Context,new string[] { localPath }, null, null);
    };
    var url = new Uri(URL);
    webClient.DownloadDataAsync(url);
}

这里你必须使用xamarin forms PCL的依赖服务来调用这个方法,project.This会将你的图片存储到公共文件夹中。我会编辑这个,如果我有时间做一个演示与iOS也。

票数 3
EN

Stack Overflow用户

发布于 2019-10-20 10:48:02

我真的很喜欢卡兰的方法。

我把它们组合在一起,我想在这里分享它们。实际上,它工作得很好。

代码语言:javascript
复制
public String DownloadImage(Uri URL)
{
    WebClient webClient = new WebClient();

    string folderPath   = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Images", "temp");
    string fileName     = URL.ToString().Split('/').Last();
    string filePath     = System.IO.Path.Combine(folderPath, fileName);

    webClient.DownloadDataCompleted += (s, e) =>
    {
        Directory.CreateDirectory(folderPath);

        File.WriteAllBytes(filePath, e.Result);
    };

    webClient.DownloadDataAsync(URL);

    return filePath;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51038251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档