@hugh_bliss

Как удалять статичные файлы в ASP.NET MVC Core?

попробовал реализовать удаление файлов так:
// POST: Files/Delete?id=5
        [HttpPost]
        public async void Delete (int id)
        {
            var file = await _context.Files.SingleOrDefaultAsync(m => m.Id == id);
             if (System.IO.File.Exists(/*"~" +*/file.Path))
            {
                System.IO.File.Delete(/*"~" +*/file.Path);
            }
            _context.Files.Remove(file);
            await _context.SaveChangesAsync();
        }

из базы данных строки успешно удаляются, но физически остаются в папке wwwroot. сколько не лазил по документациям - не нашел ничего по этому поводу
  • Вопрос задан
  • 1020 просмотров
Пригласить эксперта
Ответы на вопрос 2
@hugh_bliss Автор вопроса
// POST: Files/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmed(int id)
        {
            var fileModel = await _context.Files.SingleOrDefaultAsync(m => m.Id == id);
            if (System.IO.File.Exists($"wwwroot{fileModel.Path}"))
            {
                System.IO.File.Delete($"wwwroot{fileModel.Path}");
            }
            _context.Files.Remove(fileModel);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }

решил проблему вот таким кастылём... не факт что это правильно.
Ответ написан
Комментировать
Предлагаю реализацию через интерфейс IHostingEnvironment. Вот примерный вариант решения.
…
using Microsoft.AspNetCore.Hosting;

public class HomeController : Controller {
        private ApplicationContext db;
        IHostingEnvironment _appEnv;

        public HomeController (ApplicationContext context, IHostingEnvironment appEnvironment) {
            _context = context;
            _appEnv = appEnvironment;
        }

        private bool RemoveFileFromServer (string path) {
            string fullPath = _appEnv.WebRootPath + path;
            if (!System.IO.File.Exists (fullPath)) return false;
            try {
                System.IO.File.Delete (fullPath);
                return true;
            } catch (Exception e) {
                //Debug.WriteLine(e.Message);
            }
            return false;
        }

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmed(int id)
        {
            var fileModel = await _context.Files.SingleOrDefaultAsync(m => m.Id == id);
            RemoveFileFromServer(fileModel.Path)
            _context.Files.Remove(fileModel);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы