Удаляя файлы из папки wwwroot, что я делаю не так? - PullRequest
0 голосов
/ 17 ноября 2018

С моим контроллером я могу загружать файлы по определенному пути. Я пытаюсь выяснить, как удалить повторяющийся файл в моем представлении.

Метод контроллеров:

[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 голосов
/ 18 ноября 2018

Мое окончательное рабочее решение:

Просмотр файла:

(...)
@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");
        }
0 голосов
/ 17 ноября 2018

Эта часть вашего полного сгенерированного пути:

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.Хотя это не стандартный способ.Мы делаем это только для целей обучения.

Измените эту строку своего кода ->

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

В этом коде ~ укажите корневой каталог вашего приложения MVC asp.net, а папка uploaded - это папка, которую вы используете для поискаваши файлы (вы можете изменить его в папку с файлами).

Если вы измените свой код таким образом, у вас могут возникнуть небольшие проблемы, но концепция верна, и с небольшими изменениями вы можете делать то, что хотите.

Надеюсь, этот ответ поможет вам ....

...