Как я могу удалить изображение в моей папке с изображениями?

#c# #asp.net #file

#c# #asp.net #файл

Вопрос:

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

 public IActionResult Delete(int? id,MotorModel motor)
{
    var motors = db.Motors.Find(id);
    var filename = motor.Image.FileName;
    var delete = Path.Combine(hostEnvironment.WebRootPath, "Image");
    var filePath = Path.Combine(delete, filename);

    if (motors == null)
    {
        return View();
    }

    db.Entry(motors).State = EntityState.Deleted;

    if (db.SaveChanges() > 0)
    {
        if (System.IO.File.Exists(filePath))
        {
            System.IO.File.Delete(filePath);
        }
        return RedirectToAction("Index");
    }
    return View();
}
 

Комментарии:

1. Если вы помещаете код в блок try / catch, какое исключение возникает? Делает файл. Существующий вызов возвращает true?

2. он показывает мне следующее: «Ссылка на объект не установлена для экземпляра объекта». в этой строке кода: var filename = GetUniqueFileName(двигатель. Изображение. Имя файла);

3. Какая строка выдает исключение объекта? Ошибка будет указывать на то, что одно из ваших значений равно null. Есть несколько мест, где это может произойти, т.Е. id может быть нулевым, двигатель может быть нулевым, вам, вероятно, следует проверить это, прежде чем использовать их в своем коде.

4. в этой строке var filename = двигатель. Изображение. Имя файла; я использую его при загрузке файла

5. Можете ли вы это проверить, motor и motor.Image оба они не являются нулевыми?

Ответ №1:

Я подозреваю, что это связано с тем, что вы приняли сомнительное решение иметь аргумент метода MotorModel motor и локальную переменную car motors = db.Motors.Find... , и вы путаетесь в том, какой двигатель / двигатели вы должны использовать. Ксавье спрашивает вас: «Что-нибудь равно нулю?», А вы смотрите motors и говорите: «нет, ничего не равно нулю», и вместо этого код пытается удалить на основе motor

На мой взгляд, метод удаления должен принимать только идентификатор, он должен искать, что удалять на основе этого идентификатора, и удалять файл, который отслеживается БД. Он не должен принимать идентификатор и некоторые другие предоставленные пользователем данные (motormodel) и удалять файлы на основе того, что он находит в предоставленных пользователем данных. Это открывает вам возможности для злоупотреблений / попыток взлома, если вы позволяете пользователю выбирать, какие файлы удалять произвольно, изменяя предоставленные данные. На этом этапе вы также должны убедиться, учитывая, что is to delete — это int , что пользователь действительно владеет файлом, который они удаляют, иначе какой-нибудь скриптовый ребенок просто напишет цикл, который вызывает Delete(1), Delete(2) … Удалите (10000000) и удалите все содержимое вашего сервера, для смеха

В качестве подсказки по стилю метод Find вернет только один объект, поэтому переменная, которой он присвоен, не должна иметь множественного имени. Используйте множественное число для коллекций элементов