【问题标题】:Deleting files from wwwroot folder, what I am doing wrong?从 wwwroot 文件夹中删除文件,我做错了什么?
【发布时间】:2019-04-20 09:18:17
【问题描述】:

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

控制器方法:

[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

附:我猜可能是路由有问题。

【问题讨论】:

  • 您缺少领先的 / - href="/Autobus/DeleteFile?...(删除操作应该是 POST 而不是 GET)
  • @StephenMuecke 好点,谢谢,但我仍然收到Status Code: 404; Not Found 并且在public ActionResult DeleteFile(string file) 方法中没有遇到断点。 (更新问题)
  • 你有一个 AntiForgeryTokenAttribute。这可以防止通过 get 调用该方法。将删除按钮放在自己的表单中,并添加一个 AntiForgeryToken。
  • @Silvermind 我将@if(...) 移出之前的表单,并放在迭代@Html.AntiForgeryToken() &lt;form method="post" class="adminBtn"&gt; &lt;a class="down" href="/Autobus/DeleteFile?file=@(ViewBag.fileDirectory + file)"&gt;&lt;dir&gt;@file&lt;span&gt;;&lt;/span&gt;&lt;/dir&gt;&lt;/a&gt; &lt;/form&gt; 中,我遇到了同样的错误。
  • 现在将其设为“按钮”而不是“a”,并将 url 放入表单操作属性中。

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


【解决方案1】:

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

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 是哪个文件的,最后删除该文件。

所以你必须像这样改变你的代码:

在这种情况下,您的文件名是 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 文件夹是您用于定位文件的文件夹(您可以将其更改为您的文件夹)。

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

我希望这个答案可以帮助你....

【讨论】:

    【解决方案2】:

    我的最终工作解决方案:

    查看文件:

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

    【讨论】:

      猜你喜欢
      • 2012-09-27
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 2012-03-30
      相关资源
      最近更新 更多