如何将 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 对象中的每条数据都会显示在表单数据中。
我遵循了本指南 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 对象中的每条数据都会显示在表单数据中。