Xamarin Forms:获取存储在共享项目中的图像文件的路径?

Posted

技术标签:

【中文标题】Xamarin Forms:获取存储在共享项目中的图像文件的路径?【英文标题】:Xamarin Forms: Get the path of an image file stored on the shared project? 【发布时间】:2021-02-17 23:18:25 【问题描述】:

我正在尝试通过我的网络服务将图像文件上传为ByteArrayContent。我已将所有图像添加到共享项目中,并将构建操作设置为Embedded resource

以下是我的代码:

var fileBytes = File.ReadAllBytes("Avatars." + selectedAvatar);
var byteContent = new ByteArrayContent(fileBytes);
content.Add(byteContent, "file", selectedAvatar);

当我像上面那样尝试时,我得到System.IO.FileNotFoundException: Could not find file "/Projectname.Avatars.ic_avatar01_xx.png"

将图像直接添加到共享项目的文件夹中,如下图所示。

:

我尝试更改 .在文件路径中带有 / ,如下所示:

var fileBytes = File.ReadAllBytes("Avatars/" + selectedAvatar);
var byteContent = new ByteArrayContent(fileBytes);
content.Add(byteContent, "file", selectedAvatar);

但在这种情况下,我收到的是System.IO.DirectoryNotFoundException: Could not find a part of the path "/Avatars/ic_avatar01_xx.png"

获取存储在共享项目中的图像文件路径的正确方法是什么?

还尝试了另一种方法:

string avatarFileName = "Avatars/" + selectedAvatar;
var assembly = typeof(ProfilePage).GetTypeInfo().Assembly;
var stream = assembly.GetManifestResourceStream($"assembly.GetName().Name.avatarFileName");
content.Add(stream, "file", avatarFileName);

但在上述情况下,我收到以下错误:

【问题讨论】:

直接把图片文件放到project里才能得到图片的流。如果您确实想实现它,则需要将图像放入本地或 sd 卡。检查***.com/questions/54663101/…。 @LucasZhang-MSFT 是否可以将流转换为System.Net.Http.HttpContent?我需要通过服务传递该格式的数据。 你想用httpclient上传图片流吗? 从这里获得解决方案:forums.xamarin.com/discussion/186014/… @LucasZhang-MSFT 是的,我正在尝试上传图片 【参考方案1】:

如果你想用 Stream 上传图片,你可以检查以下代码

private async Task<string> UploadImage(Stream FileStream)
        
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("http://your.url.com/");
            MultipartFormDataContent form = new MultipartFormDataContent();
            HttpContent content = new StringContent("fileToUpload");
            form.Add(content, "fileToUpload");
            content = new StreamContent(FileStream);
            content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            
                Name = "fileToUpload",
                FileName = "xxx.png"
            ;
            form.Add(content);
            var response = await client.PostAsync("http://your.url.com/", form);
            return response.Content.ReadAsStringAsync().Result;
        

选项 2:

您也可以使用插件 FileUploaderPlugin 。支持一次上传多个文件

从文件路径上传

CrossFileUploader.Current.UploadFileAsync("<URL HERE>", new FilePathItem("<REQUEST FIELD NAME HERE>","<FILE PATH HERE>"), new Dictionary<string, string>()
            
               "<HEADER KEY HERE>" , "<HEADER VALUE HERE>"
            
);

选项 3:

MultipartFormDataContent 的第一个参数是 HttpContent。要处理流,请尝试使用继承自 HttpContent 的 StreamContent 类型。从流中获取 streamContent 并将 id 添加到 MultipartFormDataContent。

string avatarFileName = "Avatars." + selectedAvatar;
var assembly = typeof(ProfilePage).GetTypeInfo().Assembly;
var stream = assembly.GetManifestResourceStream($"assembly.GetName().Name.avatarFileName");
var streamContent = new StreamContent(stream);
content.Add(streamContent, "file", avatarFileName);

【讨论】:

以上是关于Xamarin Forms:获取存储在共享项目中的图像文件的路径?的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms 在共享项目中设置图像源

共享项目选项完全从 Visual Studio 2019 中的 Xamarin.Forms 项目菜单中消失?

Xamarin.Forms 中的 MVVMLight 的 EventToCommand

Xamarin Forms UWP - 无法调试共享代码

添加对 Xamarin.Forms 的项目引用

Xamarin.Forms AppShell 中的共享 TitleView