将文件从 ASP.NET MVC 4.6 应用程序发布到 ASP.NET Core Web API
Posting a file from ASP.NET MVC 4.6 application to ASP.NET Core Web API
我在 .NET Framework 4.6 中使用了一个 ASP.NET MVC 网络应用程序。
我需要能够上传文件,然后将它们转发到 ASP.NET Core 3.1 Web API。
问题是我不知道如何将文件从客户端应用程序发送到 API。
API 接受这样的请求:
public class ReportUploadRequest
{
public List<IFormFile> Files { get; set; }
public int FolderId { get; set; }
public int BrokerId { get; set; }
}
和 ASP.NET MVC 应用程序有一个控制器功能,它接受表单提交并尝试 post 到 API。
表单中的文件在 ASP.NET MVC 中接收,如下所示:
HttpPostedFileBase[] Files
我不知道如何将 HttpPostedFileBase[] Files
文件转换为 Web API 所需的 List<IFormFile> Files
格式 API。
我已尝试使用 List<IFormFile> Files
在我的控制器中接收文件,但 Files
在提交时为空
我如何准备我的表单以便以适合 Web 的格式使用 API?
我不确定这就是您所要求的,但我认为它可能是。我发现只要我能从二进制文件中得到一些东西,那么我就是黄金。这也为我提供了与其他语言(如 C++)的良好互操作性。
如果不是你问的..告诉我,我会删除我的答案。
这就是我所做的。我特别需要将二进制数据传递到我的控制器并返回二进制数据。
对于我的用例,秘密在 application/octet-stream.
[Route("api/[controller]")]
[ApiController]
public class SomeDangController : ControllerBase
{
[HttpPost]
[Produces("application/octet-stream")]
public async Task<Stream> GetBinaryThingy()
{
using (var reader = new StreamReader(HttpContext.Request.Body))
{
using (MemoryStream ms = new MemoryStream())
{
await reader.BaseStream.CopyToAsync(ms);
var buffer = ms.ToArray();
//buffer now holds binary data from the client
}
}
byte[] bytes_return = null //populate your binary return here.
return new MemoryStream(bytes_return);
}
}
而在客户端.. 是这样的:
public async System.Threading.Tasks.Task<byte[]> PostBinaryStuffAsync(byte[] buffer)
{
ByteArrayContent byteContent = new ByteArrayContent(buffer);
var response = await client.PostAsync(dangServerURL, byteContent);
var responseBytes = await response.Content.ReadAsByteArrayAsync();
return responseBytes;
}
I need to be able to upload files and then forward them to a ASP.NET Core 3.1 Web API.
为了达到你的要求,你可以参考下面的代码片段。
在 ASP.NET MVC 控制器动作中
public async Task<ActionResult> UploadFile(HttpPostedFileBase[] files)
{
var formContent = new MultipartFormDataContent();
foreach (var file in files)
{
formContent.Add(new StreamContent(file.InputStream), "files", Path.GetFileName(file.FileName));
}
var myHttpClient = new HttpClient();
var response = await myHttpClient.PostAsync("https://xxxx/xxxx/UploadFile", formContent);
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
//...
}
在ASP.NET核心动作方法
public async Task<IActionResult> UploadFile([FromForm]List<IFormFile> files)
{
//...
测试结果
我在 .NET Framework 4.6 中使用了一个 ASP.NET MVC 网络应用程序。
我需要能够上传文件,然后将它们转发到 ASP.NET Core 3.1 Web API。
问题是我不知道如何将文件从客户端应用程序发送到 API。
API 接受这样的请求:
public class ReportUploadRequest
{
public List<IFormFile> Files { get; set; }
public int FolderId { get; set; }
public int BrokerId { get; set; }
}
和 ASP.NET MVC 应用程序有一个控制器功能,它接受表单提交并尝试 post 到 API。
表单中的文件在 ASP.NET MVC 中接收,如下所示:
HttpPostedFileBase[] Files
我不知道如何将 HttpPostedFileBase[] Files
文件转换为 Web API 所需的 List<IFormFile> Files
格式 API。
我已尝试使用 List<IFormFile> Files
在我的控制器中接收文件,但 Files
在提交时为空
我如何准备我的表单以便以适合 Web 的格式使用 API?
我不确定这就是您所要求的,但我认为它可能是。我发现只要我能从二进制文件中得到一些东西,那么我就是黄金。这也为我提供了与其他语言(如 C++)的良好互操作性。
如果不是你问的..告诉我,我会删除我的答案。
这就是我所做的。我特别需要将二进制数据传递到我的控制器并返回二进制数据。
对于我的用例,秘密在 application/octet-stream.
[Route("api/[controller]")]
[ApiController]
public class SomeDangController : ControllerBase
{
[HttpPost]
[Produces("application/octet-stream")]
public async Task<Stream> GetBinaryThingy()
{
using (var reader = new StreamReader(HttpContext.Request.Body))
{
using (MemoryStream ms = new MemoryStream())
{
await reader.BaseStream.CopyToAsync(ms);
var buffer = ms.ToArray();
//buffer now holds binary data from the client
}
}
byte[] bytes_return = null //populate your binary return here.
return new MemoryStream(bytes_return);
}
}
而在客户端.. 是这样的:
public async System.Threading.Tasks.Task<byte[]> PostBinaryStuffAsync(byte[] buffer)
{
ByteArrayContent byteContent = new ByteArrayContent(buffer);
var response = await client.PostAsync(dangServerURL, byteContent);
var responseBytes = await response.Content.ReadAsByteArrayAsync();
return responseBytes;
}
I need to be able to upload files and then forward them to a ASP.NET Core 3.1 Web API.
为了达到你的要求,你可以参考下面的代码片段。
在 ASP.NET MVC 控制器动作中
public async Task<ActionResult> UploadFile(HttpPostedFileBase[] files)
{
var formContent = new MultipartFormDataContent();
foreach (var file in files)
{
formContent.Add(new StreamContent(file.InputStream), "files", Path.GetFileName(file.FileName));
}
var myHttpClient = new HttpClient();
var response = await myHttpClient.PostAsync("https://xxxx/xxxx/UploadFile", formContent);
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
//...
}
在ASP.NET核心动作方法
public async Task<IActionResult> UploadFile([FromForm]List<IFormFile> files)
{
//...
测试结果