使用 RestSharp 将图像上传到 WCF API - 图像无效
本文关键字:图像 API WCF 无效 RestSharp 使用 | 更新日期: 2023-09-27 18:32:13
我已经成功地制作了一个应用程序,该应用程序将请求从我的Windows Phone发送到托管在Azure Web角色中的WCF API。我正在使用一个 restful POST 方法来使用 RestSharp 来做到这一点。这一切都运行良好,图像出现在存储中,但图像没有像正常图像文件那样打开。
将它们与我之前上传的其他图像进行比较,在元数据信息中,它说无法查看的图像有一个 contentMD5 字段,该字段设置为"AKEYWqGgulwi6/9/VY2KPg=="(而其他图像则没有)这可能是导致文件问题的原因吗?
我已经附上了我的 RestSharp 代码,也许我正在添加一些我不应该添加的东西?我怀疑错误一定来自这里,因为这是操纵图像流的唯一地方。
public void SendRequest(Stream imageStream, string imageID)
{
var client = new RestClient();
client.BaseUrl = apiAddress;
var request = new RestRequest("agerecog/{imageName}", Method.POST);
request.AddUrlSegment("imageName", imageID);
//convert imagestream to byte array
var byteArray = new byte[imageStream.Length];
imageStream.Read(byteArray, 0, (int)imageStream.Length);
//add byteArray to request
request.AddFile("image/jpeg", byteArray, imageID);
var url = client.BuildUri(request).ToString();
client.ExecuteAsync<VizageResponse>(request, response =>
{
//request info. to be added here
});
}
编辑 #1经过一些工作,我决定将 addFile 行更改为:
request.AddFile(null, byteArray, null);
这改变了流长度,也使 contentMD5 字段为空。但是,该图像仍然不是有效的图像文件。鉴于我正在比较的图像都来自Windows Phone模拟器,它们都应该是一个相同的白色页面,角落里有一个黑色的小方块 - 但是文件之间的大小不同(有效图像文件的长度为5670,原始代码为6076长度,使用上面的第二个addFile为6239长度)
编辑#2做更多的分析,当图像流被发送之前,它的长度属性是6116,当它到达服务器时,但它是6370。我相信 264 是从 RestSharp 方法中的某个地方添加的,或者当数据流在服务器端被解释时。WCF 服务的代码:
[WebInvoke(UriTemplate = "/agerecog/{imageName}", Method = "POST")]
VizageResult analyseFace(string imageName, Stream imageStream);
问题已解决
我终于解决了这个问题,最终结果可以看到图像。正在发生的事情是,imageStream还包含有关文件名的数据,这导致它(保存在Azure中时)不显示为图像文件。
我通过使用此处找到的 MultipartParser 类来解决此问题:http://multipartparser.codeplex.com/服务器端将请求解析为文件名和文件流块。然后,我使用正常过程保存了此字节[]中的图像。
我将 webrequest 数据解析为其组成部分的代码如下:
MemoryStream imageStream = new MemoryStream();
MultipartParser parser = new MultipartParser(dataStream);
if (parser != null && parser.Success)
{
imageName = parser.Filename;
imageStream.Write(parser.FileContents, 0, parser.FileContents.Length);
}
当您使用内存流时,请记住将其位置设置回 0 - 这是我犯的小学生错误!
我不太熟悉RestSharp。你能确保MD5是正确的吗?尝试将 Blob 中的数据与原始图像文件中的数据进行比较。例如,检查它们是否具有相同的大小,第一个/最后几个字节是否相同(并假设中间的字节也相同)。