我有一个端点,需要接受文件上传以及客户端请求中的其他一些信息。使用以下代码,我可以成功上传文件,但似乎无法弄清楚如何阅读其他信息。
我使用以下表单数据向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)
相同的技巧,但我希望我能够获得更简单的解决方案。有什么想法吗?
答案 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);
请注意,这远不是安全的,尽管代码很少并且恰好可以正常工作。