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

How can I add JSON data to my file upload in Web API?

我遵循了本指南 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 });
}

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

看看 Fiddler 中的表单 post。您应该在文本视图选项卡上看到类似这样的内容:

------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--

在这个例子中,我的表单在表单上有一个 "RecordTypeId"、"RecordId" 和 "Tags" 字段。因此,您可以从 "provider.FormData" 中读取该数据,就像您对用户名所做的那样。

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