Удаление выгруженного файла с сервера в ASP.NET MVC3 - PullRequest
2 голосов
/ 04 августа 2011

Я пытаюсь загрузить файлы в папку со стороны администратора, например CMS. Внешний интерфейс будет отображать ссылки для загрузки файла. На стороне администратора я хотел бы не только удалить ссылку, но и удалить сам файл с сервера.

Вот часть моего контроллера, которая сохраняет загруженный файл:

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
    if (file != null && file.ContentLength > 0)
    {
        var fileName = Path.GetFileName(file.FileName);
        var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
        file.SaveAs(path);

        ViewBag.fileName = fileName.ToString();

        return RedirectToAction("Create", new {fileName = fileName });
    }

    return RedirectToAction("Index");
}

В представлении Create администратору разрешается вводить другие сведения о документе, которые хранятся в таблице вместе с fileName.

Теперь мне нужно иметь возможность ссылаться на это имя документа, например document.pdf. Могу ли я даже ссылаться на папку загрузки в папке App_Data?

Кроме того, как удалить файл, а не только строку таблицы при выполнении удаления?

Ответы [ 2 ]

1 голос
/ 04 августа 2011

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

public ActionResult GetDocument(String pathName)
{
    try
    {
        Byte[] buffer = DownloadMyFileFromSomeWhere(pathName);
        FileContentResult result = new FileContentResult(buffer, "PDF"); // or whatever file ext
        // these next two lines are optional
        String[] folders = pathName.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);            
        result.FileDownloadName = folders[folders.Length - 1];

        return result;
    }
    catch (Exception ex)
    {
        // log the error or something
    }
    return new HttpNotFoundResult();
}

Где DownloadMyFileFromSomeWhere(string) должен иметь возможность извлечь файл байтового массива из некоторого хранилища, такого как большой двоичный объект или даже локальный сервер. Это может выглядеть примерно так:

private Byte[] DownloadMyFileFromSomeWhere(string pathname)
{
    Byte[] file = System.IO.File.ReadAllBytes(Server.MapPath(pathname));
    return file;
}

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

0 голосов
/ 04 августа 2011

Некоторые заметки:

  • Если у вас есть права на сохранение файла где-то, у вас также должны быть права на его удаление. Для этого вы можете использовать обычные файловые операции.
  • IIS должен заблокировать вам ссылку на файл в App_Data. У вас есть несколько вариантов:
    • Создать действие, которое считывает файл из этого местоположения и передает его обратно в браузер
    • Хранить в другом месте - где-то, к чему у пользователя фактически будет доступ.

Преимущество первого варианта заключается в том, что вы можете легко добавить аутентификацию и т. Д. К своему действию для защиты доступа к файлам, тогда как второй вариант потребует от вас добавления web.config в папку с соответствующими ролями и права доступа. Однако, с другой стороны, вам нужно будет указать соответствующие заголовки в вашем методе действия, чтобы браузер знал, что делать с файлом, а не позволять IIS выяснить это за вас.

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