Как получить путь к файлу изображения из Memory Stream?

Я использую проект Xamarin.Forms PCL, и я использую плагин SignaturePad для захвата подписи, и я сохраняю в потоке памяти, как:

var imageStream = await 
signaturePad.GetImageStreamAsync(SignatureImageFormat.Png);
var signatureMemoryStream = new MemoryStream();
imageStream.CopyTo(signatureMemoryStream);
byte[] data = signatureMemoryStream.ToArray();

Теперь, что мне нужно сделать, это прикрепить это изображение подписи в электронном письме. Поэтому для этого я использую плагин Cross-Messaging NuGet, который позволяет мне прикреплять изображение внутри электронного письма. Итак, мне нужен путь с изображением подписи. Так что любая идея, как я могу сохранить подпись в моем локальном пути общего проекта Xamarin PCL и получить путь для изображения?

1 ответ

Сохранение файла на устройстве зависит от устройства, поэтому вы не можете сделать это напрямую в PCL. Что вы можете сделать, это использовать внедрение зависимостей для вызова ваших проектов Android и iOS, чтобы выполнить сохранение и вернуть заголовок. Итак, из вашего кода вы бы позвонили:

var filePath = DependencyService.Get<IPlatform>().SaveFile(fileBytes, fileName);

который определен в вашем PCL:

public interface IPlatform
{
    string SaveAndOpenFile(byte[] fileBytes, string fileName);
    void DownloadFile(string url);
}

Тогда в вашем проекте Android вы бы сделали что-то вроде...:

[assembly: Xamarin.Forms.Dependency(typeof(Platform))]

namespace MyApp.Droid.Classes
{
    internal class Platform : IPlatform
    {
    public async void SaveAndOpenFile(byte[] fileBytes, string fileName)
    {
        var filePath = string.Empty;
        try
        {
            // Write File
            var directory = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
            directory = Path.Combine(directory, Android.OS.Environment.DirectoryDownloads);
            filePath = Path.Combine(directory, fileName);
            File.WriteAllBytes(filePath, fileBytes);
            return filePath
        }
    }
        }
    }

и аналогично в iOS:

[assembly: Xamarin.Forms.Dependency(typeof(Platform))]

namespace MyApp.iOS.Classes
{
internal class Platform : IPlatform
{
    public void SaveAndOpenFile(byte[] fileBytes, string fileName)
    {
    }
  }
}
Другие вопросы по тегам