C#:从 body 发布模型并文件为 MultipartFormDataContent
C#: Posting Model from body and file as MultipartFormDataContent
我正在寻找一种在一个请求中发送模型和图像的方法。我试图从 body 发送我的模型,但我不知道如何发送文件。除了在不同的文件中发送图像和模型之外,还有其他方法吗?
这是我的 API 中的 POST 方法:
[HttpPost]
[Route("UploadNewEvent")]
public async Task<IActionResult> CreateNewEventAsync([FromBody] EventModel model)
{
var file = this.Request.Form.Files.LastOrDefault();
if (file != null)
{
var uploads = Path.Combine(_environment.WebRootPath, "uploads");
using (var fileStream = new FileStream(Path.Combine(uploads, "test.jpg"), FileMode.Create))
{
await file.CopyToAsync(fileStream);
}
}
// do sth with model later
return Ok();
}
这是来自我的应用程序的代码:
public async Task SendNewEvent(EventModel model, MediaFile photo)
{
var uri = $"{baseUri}api/User/Event/CreateNewEvent";
if (photo != null)
{
var multipartContent = new MultipartFormDataContent();
multipartContent.Add(new StreamContent(photo.GetStream()), "\"file\"", $"\"{photo.Path}\"");
var httpClient = new HttpClient();
var jsonObject = JsonConvert.SerializeObject(model);
var stringContent = new StringContent(jsonObject, Encoding.UTF8, "application/json");
var httpResponseMessage = await httpClient.PostAsync(uri, stringContent);
}
}
要通过 File 参数传递模型,您需要 post 数据作为表单数据。
按照以下步骤操作:
将FromBody
改为FromForm
[HttpPost]
[Route("UploadNewEvent")]
public async Task<IActionResult> CreateNewEventAsync([FromForm] EventModel model)
{
// do sth with model later
return Ok();
}
更改客户端代码以发送表单数据而不是 json 字符串
var uri = $"https://localhost:44339/UploadNewEvent";
FileStream fileStream = new FileStream(@"filepath\T1.PNG", FileMode.Open);
var multipartContent = new MultipartFormDataContent();
multipartContent.Add(new StreamContent(fileStream), "\"file\"", @"filepath\T1.PNG");
// EventModel other fields
multipartContent.Add(new StringContent("2"), "Id");
multipartContent.Add(new StringContent("Tom"), "Name");
var httpClient = new HttpClient();
var httpResponseMessage = httpClient.PostAsync(uri, multipartContent).Result;
事件模型
public class EventModel
{
public int Id { get; set; }
public string Name { get; set; }
public IFormFile File { get; set; }
}
我已经通过以下代码解决了此类问题。如果您发现任何困难,请告诉我。在我的示例中,我使用了文件、模型对象和简单的字符串,这将在将来有所帮助。
using Newtonsoft.Json;
using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace TestingProject
{
class Program1
{
static void Main(string[] args)
{
UploadFile();
}
public static async Task UploadFile()
{
HttpClient httpClient = new HttpClient
{
BaseAddress = new Uri("https://google.com/")
};
var filepath = @"C:\Sample Documents.pdf";
var filename = "Sample Documents.pdf";
using (MultipartFormDataContent content = new MultipartFormDataContent())
{
ByteArrayContent fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(filepath));
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = filename };
fileContent.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
Request request = new Request()
{
UserId = "1",
UserName = "test",
address = new AddressModel()
{
City = "test",
Country = "India"
},
FileDetails = fileContent
};
var addressSerialize = JsonConvert.SerializeObject(request.address);
FileStream fileStream = new FileStream(filepath, FileMode.Open);
var multipartContent = new MultipartFormDataContent();
multipartContent.Add(new StreamContent(fileStream), "\"file\"", filepath);
multipartContent.Add(new StringContent(request.UserId), "UserId");
multipartContent.Add(new StringContent(request.UserName), "UserName");
multipartContent.Add(new StringContent(addressSerialize), "address");
HttpResponseMessage httpResponseMessage = await httpClient.PostAsync("upload", multipartContent).ConfigureAwait(false);
var personResponse = await httpResponseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);
}
}
public class Request
{
/// <summary>
/// userId
/// </summary>
[JsonProperty(PropertyName = "userId")]
public string UserId { get; set; }
/// <summary>
/// UserName
/// </summary>
[JsonProperty(PropertyName = "UserName")]
public string UserName { get; set; }
/// <summary>
/// docType
/// </summary>
[JsonProperty(PropertyName = "FileDetails")]
public ByteArrayContent FileDetails { get; set; }
/// <summary>
/// address
/// </summary>
[JsonProperty(PropertyName = "address")]
public AddressModel address { get; set; }
}
public class AddressModel
{
/// <summary>
/// City
/// </summary>
[JsonProperty(PropertyName = "City")]
public string City { get; set; }
/// <summary>
/// Country
/// </summary>
[JsonProperty(PropertyName = "Country")]
public string Country { get; set; }
}
}
}
我正在寻找一种在一个请求中发送模型和图像的方法。我试图从 body 发送我的模型,但我不知道如何发送文件。除了在不同的文件中发送图像和模型之外,还有其他方法吗?
这是我的 API 中的 POST 方法:
[HttpPost]
[Route("UploadNewEvent")]
public async Task<IActionResult> CreateNewEventAsync([FromBody] EventModel model)
{
var file = this.Request.Form.Files.LastOrDefault();
if (file != null)
{
var uploads = Path.Combine(_environment.WebRootPath, "uploads");
using (var fileStream = new FileStream(Path.Combine(uploads, "test.jpg"), FileMode.Create))
{
await file.CopyToAsync(fileStream);
}
}
// do sth with model later
return Ok();
}
这是来自我的应用程序的代码:
public async Task SendNewEvent(EventModel model, MediaFile photo)
{
var uri = $"{baseUri}api/User/Event/CreateNewEvent";
if (photo != null)
{
var multipartContent = new MultipartFormDataContent();
multipartContent.Add(new StreamContent(photo.GetStream()), "\"file\"", $"\"{photo.Path}\"");
var httpClient = new HttpClient();
var jsonObject = JsonConvert.SerializeObject(model);
var stringContent = new StringContent(jsonObject, Encoding.UTF8, "application/json");
var httpResponseMessage = await httpClient.PostAsync(uri, stringContent);
}
}
要通过 File 参数传递模型,您需要 post 数据作为表单数据。
按照以下步骤操作:
将
FromBody
改为FromForm
[HttpPost] [Route("UploadNewEvent")] public async Task<IActionResult> CreateNewEventAsync([FromForm] EventModel model) { // do sth with model later return Ok(); }
更改客户端代码以发送表单数据而不是 json 字符串
var uri = $"https://localhost:44339/UploadNewEvent"; FileStream fileStream = new FileStream(@"filepath\T1.PNG", FileMode.Open); var multipartContent = new MultipartFormDataContent(); multipartContent.Add(new StreamContent(fileStream), "\"file\"", @"filepath\T1.PNG"); // EventModel other fields multipartContent.Add(new StringContent("2"), "Id"); multipartContent.Add(new StringContent("Tom"), "Name"); var httpClient = new HttpClient(); var httpResponseMessage = httpClient.PostAsync(uri, multipartContent).Result;
事件模型
public class EventModel { public int Id { get; set; } public string Name { get; set; } public IFormFile File { get; set; } }
我已经通过以下代码解决了此类问题。如果您发现任何困难,请告诉我。在我的示例中,我使用了文件、模型对象和简单的字符串,这将在将来有所帮助。
using Newtonsoft.Json;
using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace TestingProject
{
class Program1
{
static void Main(string[] args)
{
UploadFile();
}
public static async Task UploadFile()
{
HttpClient httpClient = new HttpClient
{
BaseAddress = new Uri("https://google.com/")
};
var filepath = @"C:\Sample Documents.pdf";
var filename = "Sample Documents.pdf";
using (MultipartFormDataContent content = new MultipartFormDataContent())
{
ByteArrayContent fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(filepath));
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = filename };
fileContent.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
Request request = new Request()
{
UserId = "1",
UserName = "test",
address = new AddressModel()
{
City = "test",
Country = "India"
},
FileDetails = fileContent
};
var addressSerialize = JsonConvert.SerializeObject(request.address);
FileStream fileStream = new FileStream(filepath, FileMode.Open);
var multipartContent = new MultipartFormDataContent();
multipartContent.Add(new StreamContent(fileStream), "\"file\"", filepath);
multipartContent.Add(new StringContent(request.UserId), "UserId");
multipartContent.Add(new StringContent(request.UserName), "UserName");
multipartContent.Add(new StringContent(addressSerialize), "address");
HttpResponseMessage httpResponseMessage = await httpClient.PostAsync("upload", multipartContent).ConfigureAwait(false);
var personResponse = await httpResponseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);
}
}
public class Request
{
/// <summary>
/// userId
/// </summary>
[JsonProperty(PropertyName = "userId")]
public string UserId { get; set; }
/// <summary>
/// UserName
/// </summary>
[JsonProperty(PropertyName = "UserName")]
public string UserName { get; set; }
/// <summary>
/// docType
/// </summary>
[JsonProperty(PropertyName = "FileDetails")]
public ByteArrayContent FileDetails { get; set; }
/// <summary>
/// address
/// </summary>
[JsonProperty(PropertyName = "address")]
public AddressModel address { get; set; }
}
public class AddressModel
{
/// <summary>
/// City
/// </summary>
[JsonProperty(PropertyName = "City")]
public string City { get; set; }
/// <summary>
/// Country
/// </summary>
[JsonProperty(PropertyName = "Country")]
public string Country { get; set; }
}
}
}