【问题标题】:Asp.Net Core API receiving empty IFormFileAsp.Net Core API 接收空的 IFormFile
【发布时间】:2018-12-25 18:30:20
【问题描述】:

最近两天,我一直在尝试为我的网站创建一个图片上传系统。当我尝试将上传的图像保存在我的 Api 的“wwwroot”中时,一切都按计划进行,只是我的文件夹中有一个空图像。

在后端,我收到了在前端发送的文件名,但图像本身的字节不存在。由于某种原因,我在 post 调用中输入的流数据丢失了,但我确实在 formfile 中收到了文件名。

编辑

为了弄清楚我的应用程序,我使用 Asp.Net Mvc 作为前端,使用 Asp.Net Api 作为后端。我知道这不是您应该使用 Asp.Net 的方式,但这是一个学校项目,我必须这样做。通常我会使用 Angular 或其他东西,但现在这不是我的选择。

所以,我将数据从 Asp.Net Mvc(前端)发送到 Asp.Net Api(后端),并尝试通过将其作为表单数据发送来实现。这意味着没有正在提交的真实表单。

这是我尝试使用的指南: https://ilclubdellesei.blog/2018/02/14/how-to-upload-images-to-an-asp-net-core-rest-service-with-xamarin-forms/

后端

图像控制器:

[HttpPost("upload")]
public async Task<IActionResult> UploadImage([FromForm(Name = "file")] IFormFile file)
{
    if (file.Length == 0)
        return BadRequest("Empty file");

    string imageName = file.FileName;
    using (var fs = new FileStream("wwwroot/" + imageName, FileMode.Create, FileAccess.Write))
    {
        await file.CopyToAsync(fs);
    }

    return Ok();
}

前端

将 1 张图片作为 MemoryStream 上传到服务器的方法

private async Task<string> Upload(Stream image, string name, string contentType)
{
    _httpClient = _clientFactory.CreateClient("ProjectApi");

    HttpContent fileStreamContent = new StreamContent(image);
    fileStreamContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { Name = "file", FileName = name };
    fileStreamContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);
    using (var formData = new MultipartFormDataContent())
    {
        formData.Add(fileStreamContent);
        HttpResponseMessage response = await _httpClient.PostAsync("api/images/upload", formData);
        var input = await response.Content.ReadAsStringAsync();
        return input;
    }
}

内容好像不是空的:

文件名已成功发送到Api,但图像的字节尚未发送:

上传一些图片后的结构没有检查formfile的大小(它们是空的):

【问题讨论】:

  • 您还可以发布您在视图中使用的&lt;form&gt;&lt;input&gt; 标签来提交文件吗?我相信这将有助于澄清正在发生的事情。另外,你能确认你的&lt;form&gt;enctype="multipart/form-data"吗?
  • 嘿,我在我的问题中添加了更多信息,以便为您解决问题。
  • 我根本不会使用IFormFile 接口。只需将数据作为字节数组发送,将文件名作为单独的参数发送。
  • 我没想到!我试试看。
  • image.Position = 0; 添加为Upload 方法(前端)的第一行。

标签: c# asp.net-core file-upload iformfile


【解决方案1】:

我不是 100% 确定,但我想你得到空文件的原因是你没有设置你的 api 端点将使用什么类型的数据,也许还有表单加密类型和方法属性。我的建议是你应该将你的代码更新到下面。 ,

[Consumes("multipart/form-data")]
private async Task<string> Upload(Stream image, string name, string contentType)

如果您忘记将表单属性添加到您的 html 部分,请按以下方式设置属性&lt;form method="post" enctype="multipart/form-data"&gt;。希望这能解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多