最近两天,我一直在尝试为我的网站创建一个图像上传系统。当我尝试将上传的图像保存在我的 Api 的“wwwroot”中时,一切都按计划进行,除了我在文件夹中得到一个空图像。
在后端,我收到了我在前端发送的文件名,但图像本身的字节不存在。由于某种原因,我在 post 调用中输入的流数据丢失了,但我确实在 formfile 中收到了文件名。
编辑:
为了弄清楚我的应用程序,我使用 Asp.Net Mvc 作为前端,使用 Asp.Net Api 作为后端。我知道这不是您应该使用 Asp.Net 的方式,但这是一个学校项目,我必须这样做。通常我会使用 Angular 或其他东西,但现在这不是我的选择。
因此,我将数据从 Asp.Net Mvc(前端)发送到 Asp.Net Api(后端),并尝试通过将其作为表单数据发送来实现。这意味着没有提交的真实表格。
后端
图像控制器:
[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,但图像的字节尚未发送:
上传一些图像而不检查表单文件的大小后的结构(它们是空的):