如何在Web API中将JSON数据添加到文件上载中?

时间:2015-04-07 00:44:41

标签: c# json asp.net-web-api amazon-s3

我遵循了本指南http://jaliyaudagedara.blogspot.com/2014/08/how-to-directly-upload-files-to-amazon.html,并且我能够在我的Web API项目中成功将文件上传到Amazon S3。对结果感到满意,我决定从客户端添加剩余的JSON逻辑。该屏幕是一个创建用户屏幕,也有一个文件上传器。我想立即发送所有用户数据和上传文件,而不是使用多个电话。

这可能吗?如果是这样,我应该如何调整引用的示例,以便它可以接受JSON和上传的文件?

[HttpPost]
[Route("Employees/Upload")]
public async Task<HttpResponseMessage> Upload()
{
    StorageService storageService = new StorageService();

    if (!Request.Content.IsMimeMultipartContent())
    {
        this.Request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
    }

    InMemoryMultipartStreamProvider provider = await Request.Content.ReadAsMultipartAsync<InMemoryMultipartStreamProvider>(new InMemoryMultipartStreamProvider());

    NameValueCollection formData = provider.FormData;
    string userName = formData["UserName"];

    IList<HttpContent> files = provider.Files;

    HttpContent file = files[0];
    Stream fileStream = await file.ReadAsStreamAsync();

    storageService.UploadFile("your bucketname", userName, fileStream);
    string preSignedUrl = storageService.GeneratePreSignedURL("your bucketname", userName, 3000);

    return this.Request.CreateResponse(HttpStatusCode.OK, new { preSignedUrl });
}

1 个答案:

答案 0 :(得分:1)

是的,可以在POST和文件中捕获表单数据,但不像其他API调用那样捕获JSON。

看看Fiddler中的表格帖子。您应该在文本视图选项卡上看到类似的内容:

------WebKitFormBoundary9j1TS9WuwcTWV7OX
Content-Disposition: form-data; name="RecordTypeId"

120
------WebKitFormBoundary9j1TS9WuwcTWV7OX
Content-Disposition: form-data; name="RecordId"

1251857
------WebKitFormBoundary9j1TS9WuwcTWV7OX
Content-Disposition: form-data; name="Tags"

------WebKitFormBoundary9j1TS9WuwcTWV7OX
Content-Disposition: form-data; name="Resource"; filename="sampleUpload1.txt"
Content-Type: text/plain

Sample upload file 1
------WebKitFormBoundary9j1TS9WuwcTWV7OX--

在这个例子中,我的表单有一个&#34; RecordTypeId&#34;,&#34; RecordId&#34;和&#34;标签&#34;表格上的字段。因此,您可以从&#34; provider.FormData&#34;中读取该数据,就像您使用用户名一样。

因此,JSON对象中的每一段数据都会显示在表单数据中。