【发布时间】:2018-08-19 20:22:52
【问题描述】:
我正在使用 .Net Core 开发 Web API,我需要允许客户端上传文件列表(主要是图像)并将它们保存到服务器。
问题是当图片上传时,我尝试从保存它的文件夹中打开它,它似乎已损坏,并且它的大小与最初的不一样。
这是我的控制器的代码:
[Route("api/TestUpload")]
[Consumes("multipart/form-data")]
public class TestUploadController : Controller
{
private readonly IHostingEnvironment _env;
private readonly ApplicationContext _context;
public TestUploadController(ApplicationContext context, IHostingEnvironment env)
{
_context = context;
_env = env;
}
// GET: /<controller>/
public IActionResult Index()
{
return View();
}
[HttpPost("upload")]
public async Task<IActionResult> Post([FromForm]IList<IFormFile> files)
{
long size = files.Sum(f => f.Length);
var uploads = Path.Combine(_env.WebRootPath, "uploads");
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
var filePath = Path.Combine(uploads, formFile.FileName);
using (var fileStream = new FileStream(Path.Combine(uploads, formFile.FileName), FileMode.Create))
{
await formFile.CopyToAsync(fileStream);
fileStream.Flush();
}
}
}
return Ok(new { size });
}
}
似乎可以正常上传和保存的唯一文件是文本和 html 文件。我尝试过使用单个文件而不是列表,同样的事情。
我尝试了几种代码变体,但似乎都不起作用,我可能做错了什么,但我就是不知道它是什么。
这是一个高级 REST 客户端测试的屏幕截图: ARC screenshot
这就是我所说的“它似乎已损坏”的意思:Windows Photo Viewer screenshot
感谢任何帮助!
【问题讨论】:
-
在消息的开头添加一个字节数。在接收端提取字节计数并读取,直到接收到整个消息。当您从文件同步读取文件流时,Windows 操作系统会在文件末尾放置一个空值。当您从文件异步读取时,没有阻塞,因此您立即返回。在这种情况下,await 什么都不做。
-
奇怪,因为您的图片表明传入的
size很小。你是如何上传这个文件的? -
@jdweng 但我试过只使用
formFile.CopyTo(fileStream);而不是异步执行,但没有任何变化。 -
@Stefan 是的,据我所知,我不会超出文件大小限制。我正在使用高级 REST 客户端,并选择
multipart/form-data作为content type。 -
我在您的代码中没有发现任何明显错误。
Flush是不必要的,可以删除,但我认为这不会导致问题。您确定这些文件可以开始使用吗?
标签: c# file-upload .net-core image-uploading asp.net-core-webapi