发送图像到休息服务xamarin表格

时间:2018-01-29 14:27:32

标签: c# image rest web-services xamarin.forms

我试图将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最好的发送方式吗?

非常感谢。

2 个答案:

答案 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);