从 wwwroot 文件夹中删除文件,我做错了什么?
Deleting files from wwwroot folder, what I am doing wrong?
使用我的控制器,我可以将文件上传到特定路径。我想弄清楚如何删除我认为的重复文件。
控制器方法:
[Authorize(Roles = "Moderatorzy")]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult DeleteFile(string file)
{
if (!System.IO.File.Exists(file))
{
return NotFound();
}
System.IO.File.Delete(file);
return View("Edit");
}
查看文件:
<form asp-action="Edit" method="post" enctype="multipart/form-data">
<input type="hidden" asp-for="ID" />
(...)
@if (Enumerable.Count(ViewBag.fileList) != 0)
{
<dir>Files to download:</dir>
{
foreach (var file in ViewBag.fileList)
{
<a class="down" href="Autobus/DeleteFile?file=@(ViewBag.fileDirectory + file)"><dir>@file<span>;</span></dir></a>
}
}
}
(...)
<div class="text-center">
<button class="btn btn-success" type="submit">Zapisz</button>
<a href="javascript:history.go(-1)" class="btn btn-primary">Powrót</a>
</div>
<div class="space"></div>
现在我有两个问题:
1) Autobus
是控制器名称。 href="Autobus/DeleteFile?file=@(ViewBag.fileDirectory + file)"
给我路径:/Autobus/Autobus/DeleteFile(...)
而不是 /Autobus/DeleteFile(...)
。为什么?
2) 手动输入一个 Autobus
后,它不会调用 DeleteFile
方法。为什么?
完整生成的路由路径为:http://localhost:50686/Autobus/Autobus/DeleteFile?file=C:\Users\asus\Desktop\Praca%20IT\Programowanie\Projekty\DluzynaSzkola\ASP.NET%20Core%20-%20ostatni\Dluzyna_Szkola_2\BasicConfig\wwwroot/uploaded/bus/1.jpg
P.S。我猜这可能是路由有问题。
您的完整生成路径的这一部分:
C:\Users\asus\Desktop\Praca%20IT\Programowanie\Projekty\DluzynaSzkola\ASP.NET%20Core%20-%20ostatni\Dluzyna_Szkola_2\BasicConfig\wwwroot/uploaded/bus/1.jpg
是因为这行代码中有ViewBag.fileDirectory
->
<a class="down" href="Autobus/DeleteFile?file=@(ViewBag.fileDirectory + file)"><dir>@file<span>;</span></dir></a>
您使用服务器(本地计算机)中文件的真实路径进行查看,这会产生很多问题。你应该为每个文件定义类似 id 的东西,然后将该文件的 id 发送到你的控制器操作方法,然后意识到这个 id 是哪个文件的,最后删除那个文件。
因此您必须像这样更改代码:
In this situation the name of your file is id. Although this is not the
standard way. We do this just for learning purpose.
更改这行代码 ->
<a class="down" href="Autobus/DeleteFile?file=@(ViewBag.fileDirectory + file)"><dir>@file<span>;</span></dir></a>
用这一行 ->
@Html.ActionLink( $"Delete {file}", "DeleteFile", "Autobus", new { file = file}, new { })
现在,当您在浏览器中单击每个生成的链接时,您的操作方法 DeleteFile
将收到文件名。然后如果你知道哪个目录是你的文件,你可以在你的 DeleteFile
操作方法中用这样的一行代码删除它
System.IO.File.Delete(fileDirectory+file);
Notice: If your fileDirectory
path is something like this
C:\Users\asus\Desktop\Praca%20IT\Programowanie\Projekty\DluzynaSzkola\ASP.NET%20Core%20-%20ostatni\Dluzyna_Szkola_2\BasicConfig\wwwroot/uploaded/bus/1.jpg
your action mehtod (DeleteFile
) will throw an exception. So you must
change your code in this way:
string fullPath = Request.MapPath("~/uploaded/" + file);
if (System.IO.File.Exists(fullPath))
{
System.IO.File.Delete(fullPath);
}
在此代码中 ~
指定 asp.net MVC 应用程序的根目录,uploaded
文件夹是您用来定位文件的文件夹(您可以将其更改为您的文件夹).
如果您以这种方式更改代码,一开始您可能会遇到一些小问题,但概念是正确的,稍作更改就可以做您想做的事情。
希望这个回答能帮到您....
我的最终解决方案:
查看文件:
(...)
@if (Enumerable.Count(ViewBag.fileList) > 0)
{
<dir>Wgrane już pliki:</dir>
{
foreach (var someFile in ViewBag.fileList)
{
<form asp-action="DeleteFile" method="post">
@Html.AntiForgeryToken()
<input type="hidden" name="file"value="@someFile" asp-action="@(ViewBag.fileDirectory + someFile)" />
<button class="btn btn-danger" type="submit">Usuń</button>
@someFile
</form>
}
}
}
(...)
同样在我的 DeleteFile 方法中,我必须添加 ViewBags:
[Authorize(Roles = "Moderatorzy")]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult DeleteFile(string file)
{
string fileDirectory = Path.Combine(
Directory.GetCurrentDirectory(), "wwwroot/uploaded/bus/");
ViewBag.fileList = Directory
.EnumerateFiles(fileDirectory, "*", SearchOption.AllDirectories)
.Select(Path.GetFileName);
ViewBag.fileDirectory = fileDirectory;
string webRootPath = _hostingEnvironment.WebRootPath;
var fileName = "";
fileName = file;
var fullPath = webRootPath + "/uploaded/bus/" + file;
if (System.IO.File.Exists(fullPath))
{
System.IO.File.Delete(fullPath);
ViewBag.deleteSuccess = "true";
}
return View("Edit");
}
使用我的控制器,我可以将文件上传到特定路径。我想弄清楚如何删除我认为的重复文件。
控制器方法:
[Authorize(Roles = "Moderatorzy")]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult DeleteFile(string file)
{
if (!System.IO.File.Exists(file))
{
return NotFound();
}
System.IO.File.Delete(file);
return View("Edit");
}
查看文件:
<form asp-action="Edit" method="post" enctype="multipart/form-data">
<input type="hidden" asp-for="ID" />
(...)
@if (Enumerable.Count(ViewBag.fileList) != 0)
{
<dir>Files to download:</dir>
{
foreach (var file in ViewBag.fileList)
{
<a class="down" href="Autobus/DeleteFile?file=@(ViewBag.fileDirectory + file)"><dir>@file<span>;</span></dir></a>
}
}
}
(...)
<div class="text-center">
<button class="btn btn-success" type="submit">Zapisz</button>
<a href="javascript:history.go(-1)" class="btn btn-primary">Powrót</a>
</div>
<div class="space"></div>
现在我有两个问题:
1) Autobus
是控制器名称。 href="Autobus/DeleteFile?file=@(ViewBag.fileDirectory + file)"
给我路径:/Autobus/Autobus/DeleteFile(...)
而不是 /Autobus/DeleteFile(...)
。为什么?
2) 手动输入一个 Autobus
后,它不会调用 DeleteFile
方法。为什么?
完整生成的路由路径为:http://localhost:50686/Autobus/Autobus/DeleteFile?file=C:\Users\asus\Desktop\Praca%20IT\Programowanie\Projekty\DluzynaSzkola\ASP.NET%20Core%20-%20ostatni\Dluzyna_Szkola_2\BasicConfig\wwwroot/uploaded/bus/1.jpg
P.S。我猜这可能是路由有问题。
您的完整生成路径的这一部分:
C:\Users\asus\Desktop\Praca%20IT\Programowanie\Projekty\DluzynaSzkola\ASP.NET%20Core%20-%20ostatni\Dluzyna_Szkola_2\BasicConfig\wwwroot/uploaded/bus/1.jpg
是因为这行代码中有ViewBag.fileDirectory
->
<a class="down" href="Autobus/DeleteFile?file=@(ViewBag.fileDirectory + file)"><dir>@file<span>;</span></dir></a>
您使用服务器(本地计算机)中文件的真实路径进行查看,这会产生很多问题。你应该为每个文件定义类似 id 的东西,然后将该文件的 id 发送到你的控制器操作方法,然后意识到这个 id 是哪个文件的,最后删除那个文件。
因此您必须像这样更改代码:
In this situation the name of your file is id. Although this is not the standard way. We do this just for learning purpose.
更改这行代码 ->
<a class="down" href="Autobus/DeleteFile?file=@(ViewBag.fileDirectory + file)"><dir>@file<span>;</span></dir></a>
用这一行 ->
@Html.ActionLink( $"Delete {file}", "DeleteFile", "Autobus", new { file = file}, new { })
现在,当您在浏览器中单击每个生成的链接时,您的操作方法 DeleteFile
将收到文件名。然后如果你知道哪个目录是你的文件,你可以在你的 DeleteFile
操作方法中用这样的一行代码删除它
System.IO.File.Delete(fileDirectory+file);
Notice: If your
fileDirectory
path is something like thisC:\Users\asus\Desktop\Praca%20IT\Programowanie\Projekty\DluzynaSzkola\ASP.NET%20Core%20-%20ostatni\Dluzyna_Szkola_2\BasicConfig\wwwroot/uploaded/bus/1.jpg
your action mehtod (DeleteFile
) will throw an exception. So you must change your code in this way:
string fullPath = Request.MapPath("~/uploaded/" + file);
if (System.IO.File.Exists(fullPath))
{
System.IO.File.Delete(fullPath);
}
在此代码中 ~
指定 asp.net MVC 应用程序的根目录,uploaded
文件夹是您用来定位文件的文件夹(您可以将其更改为您的文件夹).
如果您以这种方式更改代码,一开始您可能会遇到一些小问题,但概念是正确的,稍作更改就可以做您想做的事情。
希望这个回答能帮到您....
我的最终解决方案:
查看文件:
(...)
@if (Enumerable.Count(ViewBag.fileList) > 0)
{
<dir>Wgrane już pliki:</dir>
{
foreach (var someFile in ViewBag.fileList)
{
<form asp-action="DeleteFile" method="post">
@Html.AntiForgeryToken()
<input type="hidden" name="file"value="@someFile" asp-action="@(ViewBag.fileDirectory + someFile)" />
<button class="btn btn-danger" type="submit">Usuń</button>
@someFile
</form>
}
}
}
(...)
同样在我的 DeleteFile 方法中,我必须添加 ViewBags:
[Authorize(Roles = "Moderatorzy")]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult DeleteFile(string file)
{
string fileDirectory = Path.Combine(
Directory.GetCurrentDirectory(), "wwwroot/uploaded/bus/");
ViewBag.fileList = Directory
.EnumerateFiles(fileDirectory, "*", SearchOption.AllDirectories)
.Select(Path.GetFileName);
ViewBag.fileDirectory = fileDirectory;
string webRootPath = _hostingEnvironment.WebRootPath;
var fileName = "";
fileName = file;
var fullPath = webRootPath + "/uploaded/bus/" + file;
if (System.IO.File.Exists(fullPath))
{
System.IO.File.Delete(fullPath);
ViewBag.deleteSuccess = "true";
}
return View("Edit");
}