【问题标题】:How to programmatically upload a file in .NET 5 to a .NET 5 Rest API without losing content?如何以编程方式将 .NET 5 中的文件上传到 .NET 5 Rest API 而不会丢失内容?
【发布时间】:2021-02-16 13:34:29
【问题描述】:

我创建了一个 .NET 5 REST Api。我可以轻松地从 swagger 上传文件。那工作正常。调试的时候可以看到字节数组不为空。这是控制器方法:

[Route("api/[controller]")]
[ApiController]
public class ImageController : ControllerBase
{

    // POST api/<ImageController>
    [HttpPost]
    public void Post([FromForm] UserModel info)
    { 
        var memoryStream = new MemoryStream();
        info.Avatar.CopyTo(memoryStream);
        var bytes = memoryStream.ToArray();
    }
}

这是UserModel

public class UserModel
{
    [FromForm(Name = "avatar")]
    public IFormFile Avatar { get; set; }

    [FromForm(Name = "name")]
    public string Name { get; set; }
}

我还尝试以编程方式上传文件。这并不完全有效。在控制器方法中放置断点时,我看到字节数组为空。所以调用本身正在工作,但数据没有进入。

这里是 .NET 5 Console 应用程序上传文件的源代码。

正如所解释的,这确实有用,因为它确实调用了 REST API,我可以通过在控制器方法中放置断点来看到这一点。但是,我的控制器方法没有得到任何数据。字节数组为空。

    private static async Task TryUpload()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:5000");
            string filePath = "C:\\Users\\daan1982\\Pictures\\RiderStart.png";
            var fileStream = File.Create(filePath);
            using (var content =
                new MultipartFormDataContent("Upload----" + DateTime.Now.ToString(CultureInfo.InvariantCulture)))
            {
                content.Add(new StreamContent(fileStream), "avatar", "RiderStart.png");

                var result = await client.PostAsync("/api/Image", content);
                var request = result.RequestMessage;
            }
        }
    }

    static async Task Main(string[] args)
    {
        await TryUpload();
        Console.WriteLine("Hello World!");
    }

当我在上传和请求模型中将内容命名为“头像”时,这应该可以正常工作。但是,它确实有效,但不是很好,因为字节数组始终为空。

我做错了什么?我该如何解决这个问题?

【问题讨论】:

    标签: c# asp.net-core http-post asp.net-core-webapi .net-5


    【解决方案1】:
    【解决方案2】:

    对我来说就是这样。

        static async Task Main(string[] args)
        {
            await TryUpload();
        }
    
        private const string Boundary = "EAD567A8E8524B2FAC2E0628ABB6DF6E";
    
        private static readonly HttpClient HttpClient = new()
        {
            BaseAddress = new Uri("https://localhost:5001/")
        };
    
        private static async Task TryUpload()
        {
            var requestContent = new MultipartFormDataContent(Boundary);
            requestContent.Headers.Remove("Content-Type");
            requestContent.Headers.TryAddWithoutValidation("Content-Type", $"multipart/form-data; boundary={Boundary}");
    
            var fileContent = await File.ReadAllBytesAsync(@"<path to file\Unbenannt.PNG");
            var byteArrayContent = new ByteArrayContent(fileContent);
            byteArrayContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/png");
    
            requestContent.Add(byteArrayContent, "avatar", "Unbenannt.PNG");
    
            var postResponse = await HttpClient.PostAsync("/api/Image", requestContent);
        }
    

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 2018-12-11
      • 2014-03-29
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      相关资源
      最近更新 更多