.NET Core 6 上传文件到 wwwroot/images 有时会失败并上传一半图像
.NET Core 6 upload file to wwwroot/images fails sometimes and uploads half images
我正在尝试将文件从网站上传到我的 wwwroot/images 目录,但有时只有一半的图像被上传并且它似乎不适用于 .png 文件,这是我的代码:
[HttpPost]
public IActionResult UploadFile(IFormFile userfile)
{
MgvaKrantransportContext DBContext = new MgvaKrantransportContext();
try
{
Image image = new Image() { Filepath = "images/" + userfile.FileName, Filename = userfile.FileName };
DBContext.Add(image);
DBContext.SaveChanges();
}
catch (Exception ex)
{
ViewBag.message = ex.Message;
}
try
{
string filename = userfile.FileName;
filename = Path.GetFileName(filename);
string uploadFilePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot\images", filename);
var stream = new FileStream(uploadFilePath, FileMode.Create);
userfile.CopyToAsync(stream);
ViewBag.message = "Success";
}
catch (Exception ex)
{
ViewBag.message = ex.Message;
}
return RedirectToAction("Index");
}
视图中的表单如下:
@using (Html.BeginForm("UploadFile", "Management", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<h2>Upload File</h2>
<input type="file" name="userfile">
<br />
<input type="submit" value="Upload" />
}
先谢谢了!
最好的祝福 Max
The CopyToAsync
method returns a Task
必须 await
ed 才能使复制成功。您的代码当前正在复制完成前关闭目标流。
要么更改您的代码以使用 the synchronous CopyTo
method,要么使您的操作方法 async
和 await
成为任务。
在将名称保存到数据库之前,您还需要从 FileName
中删除任何目录信息 - 您在构建物理路径时已经完成了,但对于 Image
实体。
并将 await using
添加到 DbContext
和 FileStream
实例以确保它们始终被正确处理。
如果您要 return 重定向,那么在 ViewBag
中存储值是没有意义的;这些价值观将永远丢失。您可以改用 TempData
,它将消息存储在会话中。
而Directory.GetCurrentDirectory()
并不是获取应用程序根路径的最佳方式。相反,注入 the IWebHostEnvironment
service 并使用它的 WebRootPath
属性 来查找 wwwroot
文件夹的物理路径。
[HttpPost]
public async Task<IActionResult> UploadFile(IFormFile userfile)
{
await using MgvaKrantransportContext DBContext = new MgvaKrantransportContext();
try
{
string filename = userfile.FileName;
filename = Path.GetFileName(filename);
Image image = new()
{
Filepath = "images/" + filename,
Filename = filename
};
await DBContext.AddAsync(image);
await DBContext.SaveChangesAsync();
string uploadFilePath = Path.Combine(WebHost.WebRootPath, "images", filename);
await using var stream = new FileStream(uploadFilePath, FileMode.Create);
await userfile.CopyToAsync(stream);
}
catch (Exception ex)
{
// TODO: Log the error somewhere
}
return RedirectToAction("Index");
}
我正在尝试将文件从网站上传到我的 wwwroot/images 目录,但有时只有一半的图像被上传并且它似乎不适用于 .png 文件,这是我的代码:
[HttpPost]
public IActionResult UploadFile(IFormFile userfile)
{
MgvaKrantransportContext DBContext = new MgvaKrantransportContext();
try
{
Image image = new Image() { Filepath = "images/" + userfile.FileName, Filename = userfile.FileName };
DBContext.Add(image);
DBContext.SaveChanges();
}
catch (Exception ex)
{
ViewBag.message = ex.Message;
}
try
{
string filename = userfile.FileName;
filename = Path.GetFileName(filename);
string uploadFilePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot\images", filename);
var stream = new FileStream(uploadFilePath, FileMode.Create);
userfile.CopyToAsync(stream);
ViewBag.message = "Success";
}
catch (Exception ex)
{
ViewBag.message = ex.Message;
}
return RedirectToAction("Index");
}
视图中的表单如下:
@using (Html.BeginForm("UploadFile", "Management", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<h2>Upload File</h2>
<input type="file" name="userfile">
<br />
<input type="submit" value="Upload" />
}
先谢谢了! 最好的祝福 Max
The CopyToAsync
method returns a Task
必须 await
ed 才能使复制成功。您的代码当前正在复制完成前关闭目标流。
要么更改您的代码以使用 the synchronous CopyTo
method,要么使您的操作方法 async
和 await
成为任务。
在将名称保存到数据库之前,您还需要从 FileName
中删除任何目录信息 - 您在构建物理路径时已经完成了,但对于 Image
实体。
并将 await using
添加到 DbContext
和 FileStream
实例以确保它们始终被正确处理。
如果您要 return 重定向,那么在 ViewBag
中存储值是没有意义的;这些价值观将永远丢失。您可以改用 TempData
,它将消息存储在会话中。
而Directory.GetCurrentDirectory()
并不是获取应用程序根路径的最佳方式。相反,注入 the IWebHostEnvironment
service 并使用它的 WebRootPath
属性 来查找 wwwroot
文件夹的物理路径。
[HttpPost]
public async Task<IActionResult> UploadFile(IFormFile userfile)
{
await using MgvaKrantransportContext DBContext = new MgvaKrantransportContext();
try
{
string filename = userfile.FileName;
filename = Path.GetFileName(filename);
Image image = new()
{
Filepath = "images/" + filename,
Filename = filename
};
await DBContext.AddAsync(image);
await DBContext.SaveChangesAsync();
string uploadFilePath = Path.Combine(WebHost.WebRootPath, "images", filename);
await using var stream = new FileStream(uploadFilePath, FileMode.Create);
await userfile.CopyToAsync(stream);
}
catch (Exception ex)
{
// TODO: Log the error somewhere
}
return RedirectToAction("Index");
}