从wwwroot文件夹删除文件,我在做什么错?

时间:2018-11-17 10:50:50

标签: c# razor routing asp.net-core-mvc wwwroot

使用控制器,我可以将文件上传到特定路径。我试图弄清楚如何删除视图中的迭代文件。

Controllers方法:

[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>

现在我有2个问题:

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。我想路由可能有问题。

2 个答案:

答案 0 :(得分:0)

完整的生成路径的这一部分:

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发送到控制器的action方法,然后再意识到该id是针对哪个文件的,最后删除该文件。

因此,您必须像这样更改代码:

  

在这种情况下,文件名是id。虽然这不是   标准方式。我们这样做只是出于学习目的。

更改代码的这一行->

<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);
  

通知:如果您的fileDirectory路径是这样的   C:\Users\asus\Desktop\Praca%20IT\Programowanie\Projekty\DluzynaSzkola\ASP.NET%20Core%20-%20ostatni\Dluzyna_Szkola_2\BasicConfig\wwwroot/uploaded/bus/1.jpg   您的操作方法(DeleteFile)将引发异常。所以你必须   以此方式更改代码:

string fullPath = Request.MapPath("~/uploaded/" + file);
if (System.IO.File.Exists(fullPath))
{
   System.IO.File.Delete(fullPath);
}

在此代码中,~指定asp.net MVC应用程序的根,uploaded文件夹是用于定位文件的文件夹(可以将其更改为files文件夹)。

如果您以此方式更改代码,一开始可能会遇到一些小问题,但是概念是正确的,只需稍作更改,您就可以做您想做的事情。

我希望这个答案可以对您有所帮助。...

答案 1 :(得分:0)

我最后的工作解决方案:

查看文件:

(...)
@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");
        }