我正在尝试将图像从Xamarin Forms发送到Rest WebApi,但没有成功。我正在使用Montemagno的CrossMedia插件。我以这种方式将媒体文件转换为base64String:
if (photo != null)
{
var stream = photo.GetStream();
var bytes = new byte[stream.Length];
await stream.ReadAsync(bytes, 0, (int)stream.Length);
string imageBase64 = Convert.ToBase64String(bytes);
Task<string> sendFotoResult = restClient.SendImage(imageBase64);
string result = await sendFotoResult;
if( ... )
}
这是我的发送图像函数:
public async Task<string> SendImage(string foto)
{
try
{
// METHOD 1
var content = JsonConvert.SerializeObject(foto);
string url = "http://myaddress/myWS/api/Home/SendImage?foto="+ content;
var response = await _client.PostAsync(url, new StringContent(content, Encoding.UTF8, "application/json"));
return response.ReasonPhrase.ToString();
//METHOD 2
var content = JsonConvert.SerializeObject(foto);
string url = "http://myaddress/myWS/api/Home/SendImage?foto="+ content;
var result = await _client.PostAsync(url, new StringContent(content, Encoding.UTF8, "application/json"));
return result.ToString();
}catch (Exception ex)
{
return ex.Message;
}
}
方法1 显示空参数错误,方法 2 获取 URL 太长错误。
我该如何解决? 将图像转换为base64String是发送它的最佳方式吗?
非常感谢。
不应在 URI 上发送图像。您要做的是在请求正文上发送图像。这样的事情将帮助您:
var client = new HttpClient();
var form = new MultipartFormDataContent();
form.Add(new ByteArrayContent(new MemoryStream(foto).ToArray()), "foto", "foto.jpg");
然后,您必须在服务器端 api 上管理图像并将其转换回来。
编辑:我假设如果你也控制你的REST api,那么你一定是试图从uri获取图像。你不应该这样做,而是你要做的是从内容中获取它。这里有一个教程,将引导您一路走来: https://jamessdixon.wordpress.com/2013/10/01/handling-images-in-webapi/
此外,您应该调用没有如下参数的 POST 方法:
string url = "http://myaddress/myWS/api/Home/"
如果您已经在主控制器上管理 POST 以执行其他一些工作,那么您始终可以使用路由并调用如下所示的内容:
string url = "http://myaddress/myWS/api/Home/Images/"
ASP.NET 上的路由管理非常简单,在此链接中进行了很好的描述:https://learn.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
最后,我怀疑您可能需要加强您对标准关注的 REST 知识。我总是推荐以下页面来了解设计 RESTful API 应该做什么和不应该做什么: http://blog.octo.com/en/design-a-rest-api/
您可以使用 MultipartFormDataContent 将图像部分添加到 post 请求中,请尝试此示例
var upfilebytes = DependencyService.Get<ILocalFileProvider>().GetFileBytes(FileUrl);
MultipartFormDataContent content = new MultipartFormDataContent();
ByteArrayContent baContent = new ByteArrayContent(upfilebytes);
content.Add(baContent, "File", "attachment.png");
var response = await client.PostAsync(url, content);