从ASP.NET WebAPI中的数据发布请求中读取多部分的键值和文件

时间:2015-06-29 16:57:25

标签: asp.net-web-api multipartform-data

我有一个端点,需要接受文件上传以及客户端请求中的其他一些信息。使用以下代码,我可以成功上传文件,但似乎无法弄清楚如何阅读其他信息。

我使用以下表单数据向Postman发出测试请求:

  

image - myimage.jpg - 文件类型

     

电子邮件 - a@b.com - 文字类型

后端代码如下所示:

[HttpPost]
public async Task<HttpResponseMessage> SharePhoto()
{   
    try
    {
         var provider = new MultipartMemoryStreamProvider();
         var data  = await Request.Content.ReadAsMultipartAsync(provider);

         // this is how I get the image which I am succesfully passing to EmailService
         var item = (StreamContent)provider.Contents[0];
         using (var stream = new MemoryStream())
         {
             await item.CopyToAsync(stream);
             String emailAddress;
             EmailService.SendSharedPhoto(emailAddress, stream);
             return Request.CreateResponse();
         }               
     }
     catch
     {
        // do stuff
     }
}

在此示例中,我可以访问provider.Contents[1],但似乎无法将其中的值转换为emailAddress。我认为可以使用与图片上传中的await item.CopyToASync(stream)相同的技巧,但我希望我能够获得更简单的解决方案。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我昨天几乎没有回答过一个非常类似的问题。请参阅我的答案here以及样本控制器代码。

答案 1 :(得分:0)

我最终使用的方法是:

如果表单元素是字符串(并且它对我有用,因为mobiel前端负责输入数据)你可以这样做:

var streamContent = (StreamContent)provider.Contents[1];
var memStream = new MemoryStream();
await streamContent.CopyToAsync(memStream);
var actualString = Encoding.UTF8.GetString(x.ToArray());

但是,如果字段需要表示项目集合,例如电子邮件列表:[“a@b.com”,“x@c.com”]等,则JavaScriptSerializer可以是用户,如下所示:

var streamContent = (StreamContent)provider.Contents[1];
var emailAddresses = await str.ReadAsStringAsync();
var jsSerializer = new JavaScriptSerializer();
var deserializedData = jsSerializer.Deserialize<string[]>(emailAddresses);

请注意,这远不是安全的,尽管代码很少并且恰好可以正常工作。