【问题标题】:Copy image to resources Xamarin将图像复制到资源 Xamarin
【发布时间】:2017-08-22 20:33:10
【问题描述】:

我有一个 Xamarin Forms 项目,我需要用户能够在其中“加载”图像。我已经可以按下按钮并使用 FilePicker 搜索文件,如下所示:

async void OnUpload(object sender, EventArgs e)
        {
            try
            {
                FileData filedata = await CrossFilePicker.Current.PickFile();
                // the dataarray of the file will be found in filedata.DataArray 
                // file name will be found in filedata.FileName;
                //etc etc.
            }
            catch (Exception ex)
            {
            }
        } 

我现在需要将该“文件数据”(图像)复制到项目的资源文件夹中,以便轻松访问该文件。我试过了:

await CrossFilePicker.Current.SaveFile(filedata.FileName);

但它不会将任何文件保存到项目文件夹中。 而且,我只需要它在 UWP 和 Android 上工作。

【问题讨论】:

    标签: android xamarin uwp xamarin.forms filepicker


    【解决方案1】:

    SaveFile 方法将其保存在一个非常具体的文件夹中。

    如果您想将其保存在您选择的某个位置,您必须使用DependencyService 来实现它。 IO 操作非常特定于操作系统,文件路径也是如此。我会给你一个简单的例子供你参考。

    从在共享代码中定义接口开始,如下所示:

    public interface IFileManager
    {
        void SaveFile(Stream stream);
    }
    

    当然,它也可以有其他方法,或者如果你想指定文件名之类的东西,也可以有额外的参数,这取决于你。您可能还希望通过某种返回值来了解发生了什么。

    现在,每个平台都实现这个接口。例如对于 Android,它可能如下所示:

    [assembly: Xamarin.Forms.Dependency (typeof (FileManager_Android))]
    
    public class FileManager_Android : IFileManager
    {
        public void SaveFile(Stream stream)
        {
            var dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim);
    
            string filename = System.DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg";
            string filePath = System.IO.Path.Combine(dir, name);
    
            try
            {
                System.IO.File.WriteAllBytes(filePath, imageData);
            }
            catch (Exception ex)
            {
                System.Console.WriteLine(e.ToString());
            }
        }
    }
    

    (保存代码灵感来自this link

    这将获取流并将其保存到您选择的路径。

    对于 UWP,您也需要实现它,这非常相似,除了 SaveFile 的实现。据我所知,还没有插件可以让你更轻松。有PCLStorage,但这个插件似乎只适用于文本文件。不过,您仍然可以从中寻找灵感。

    【讨论】:

    • 太棒了,谢谢,唯一的问题是我不想将它保存在像 Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim); 这样的外部文件夹中但在 Drawable 文件夹中
    • 您的应用程序在设备上后,您无法在该文件夹中写入内容。另请参阅此SO post。如果它对您有所帮助,请接受它作为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    相关资源
    最近更新 更多