我试图将Xamarin Forms中的图像发送到Rest WebApi,但没有成功。我使用的是Montemagno的CrossMedia插件。我以这种方式将MediaFile转换为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( ... )
}
这是我的SendImage功能:
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最好的发送方式吗?
非常感谢。
答案 0 :(得分:1)
您不应该在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/"
如果您已经在Home Controller上管理POST以执行其他工作,那么您可以随时使用路由并调用以下内容:
string url = "http://myaddress/myWS/api/Home/Images/"
ASP.NET上的路由管理非常简单,在此链接上有很好的描述:https://docs.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/
答案 1 :(得分:0)
您可以使用MultipartFormDataContent将图像部分添加到发布请求中,请尝试此示例
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);