将图像复制到资源 Xamarin
Copy image to resources Xamarin
我有一个 Xamarin Forms 项目,我需要用户能够在其中 "load" 图片。我已经可以按下按钮并使用 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.
上工作
SaveFile
方法将其保存在一个非常特定的文件夹中。
如果您想将它保存在您选择的某个地方,您必须使用 DependencyService 来实现它。 IO 操作非常特定于 OS,文件路径也是如此。我会给你一个简单的例子,供你借鉴。
首先在您的共享代码中定义一个接口,如下所示:
public interface IFileManager
{
void SaveFile(Stream stream);
}
当然,它也可以有其他方法,或者额外的参数,如果你想指定文件名之类的东西,这取决于你。您可能还需要某种 return 值来了解发生了什么。
现在,每个平台都实现这个接口。例如 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,但这个插件似乎只适用于文本文件。不过,您仍然可以从中寻找灵感。
我有一个 Xamarin Forms 项目,我需要用户能够在其中 "load" 图片。我已经可以按下按钮并使用 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.
上工作SaveFile
方法将其保存在一个非常特定的文件夹中。
如果您想将它保存在您选择的某个地方,您必须使用 DependencyService 来实现它。 IO 操作非常特定于 OS,文件路径也是如此。我会给你一个简单的例子,供你借鉴。
首先在您的共享代码中定义一个接口,如下所示:
public interface IFileManager
{
void SaveFile(Stream stream);
}
当然,它也可以有其他方法,或者额外的参数,如果你想指定文件名之类的东西,这取决于你。您可能还需要某种 return 值来了解发生了什么。
现在,每个平台都实现这个接口。例如 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,但这个插件似乎只适用于文本文件。不过,您仍然可以从中寻找灵感。