无法在Xam.Plugins.Messaging中的WithAttachment中附加文件

时间:2016-11-22 05:25:16

标签: xamarin xamarin.forms

请查看我的代码,因为我无法在EmailMessageBuilder中附加任何文件。 另外我需要了解ContentType,我应该在ContentType中传递什么?

FileData filedata = await CrossFilePicker.Current.PickFile();
String Path = CrossGetLocalFilePath.Current.GetLocalPath(filedata.FileName);
var emailMessenger = CrossMessaging.Current.EmailMessenger;
if (emailMessenger.CanSendEmail)
{
var email = new EmailMessageBuilder()
.To("to.plugins@xamarin.com")
.Subject("Xamarin Messaging Plugin")
.Body("Well hello there from Xam.Messaging.Plugin")
.WithAttachment(Path, "image/jpeg")
.Build();
emailMessenger.SendEmail(email);
}

我在Xamarin.forms(Portable)中使用上面的代码,我的附件可能是图像,视频或任何文件。

获取错误:

  

由于IO错误而无法附加文件。

2 个答案:

答案 0 :(得分:0)

之前我从未使用过CrossFilePicker插件和CrossGetLocalFilePath插件,但我在这里找到了源代码:

CrossFilePicker:https://github.com/Studyxnet/FilePicker-Plugin-for-Xamarin-and-Windows/tree/master/FilePicker/FilePicker

CrossGetLocalFilePath:https://github.com/bradyjoslin/GetLocalFilePathPlugin/blob/master/GetLocalFilePath/GetLocalFilePath.Plugin.Android/GetLocalFilePathImplementation.cs

这是您调用CrossFilePicker.Current.PickFile()时获得的FileData对象;

  namespace Plugin.FilePicker.Abstractions
    {
        public class FileData
        {
            public byte[] DataArray { get; set; }
            public string FileName { get; set; }

        }
    }

DataArray是您的文件数据,FileName是您的文件名。它不包含文件路径。

然后调用另一个插件CrossGetLocalFilePath根据文件名获取文件路径。 在CrossGetLocalFilePath源代码中,它只是在Android平台中实现:

public class GetLocalFilePathImplementation : IGetLocalFilePath   
    {    
        public string GetLocalPath(string fileName)    
        {    
            string path = Environment.GetFolderPath(Environment.SpecialFolder.Personal);    
            return System.IO.Path.Combine(path, fileName);  
        }   
    }

它不会返回您想要的文件路径。它返回了系统特殊文件路径。

因此,在您的情况下,无法通过这些插件获取文件路径。

但我建议你覆盖CrossFilePicker插件。

以UWP为例:

public class FilePickerImplementation : IFilePicker
    {

        public async Task<FileData> PickFile()
        {
            var picker = new Windows.Storage.Pickers.FileOpenPicker();
            picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.List;
            picker.SuggestedStartLocation =
                Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary;
            picker.FileTypeFilter.Add("*");
            Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
            if (file != null)
            {
                var array = await ReadFile(file);
                return new FileData
                {
                    DataArray = array,
                    FileName = file.Name
                    FilePath = file.Path;
                };
            }
            else
            {
                return null;
            }
        }

这是UWP中文件选择器的实现。您可以在FileData对象中添加FilePath属性,如前面的代码所示。

答案 1 :(得分:0)

如果我们使用以下插件进行媒体捕获并从图库中选择图像,我们可以获得路径。

Xam.Plugin.Media

谢谢。