【发布时间】: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(后端),并尝试通过将其作为表单数据发送来实现。这意味着没有正在提交的真实表单。
后端
图像控制器:
[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的大小(它们是空的):
【问题讨论】:
-
您还可以发布您在视图中使用的
<form>和<input>标签来提交文件吗?我相信这将有助于澄清正在发生的事情。另外,你能确认你的<form>有enctype="multipart/form-data"吗? -
嘿,我在我的问题中添加了更多信息,以便为您解决问题。
-
我根本不会使用
IFormFile接口。只需将数据作为字节数组发送,将文件名作为单独的参数发送。 -
我没想到!我试试看。
-
将
image.Position = 0;添加为Upload方法(前端)的第一行。
标签: c# asp.net-core file-upload iformfile