将图像复制到资源Xamarin

时间:2017-03-29 11:20:47

标签: android xamarin uwp xamarin.forms filepicker

我有一个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)
            {
            }
        } 

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

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

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

1 个答案:

答案 0 :(得分:3)

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

如果您想将其保存在您选择的某个位置,则必须使用DependencyService来实现它。 IO操作非常特定于OS,文件路径也是如此。我将为您提供一个简单的示例供您继续使用。

首先在共享代码中定义一个接口,如下所示:

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,但此插件似乎只适用于文本文件。你仍然可以从中寻找灵感。