Как скачать файл из общей папки в asp. net используя ? - PullRequest
0 голосов
/ 11 февраля 2020

Фон:

Существует приложение asp. Net MVC, которое я сейчас воссоздаю без использования MVC.

* 1006. * В приложении MVC элементы <a>, которые позволяют пользователям загружать документ, выглядят следующим образом:
<a href="/api/file/2187/filter.jpg" target="_blank">download</a>

, и это работает, когда я нажимаю кнопку загрузки, поскольку я мог бы использовать метод, подобный приведенному ниже в MVC:

public async Task<IActionResult> Download(string path)
{
    var memory = new MemoryStream();
    using (var stream = new FileStream(path, FileMode.Open))
    {
        await stream.CopyToAsync(memory);
    }
    memory.Position = 0;
    return File(memory, GetContentType(path), Path.GetFileName(path));
}

Обратите внимание, что на странице есть таблица HTML с 500+ строками, некоторые данные имеют файл для загрузки, и только для этих строк ссылка href существует в указанном файле. c cell.

Здесь, когда я пытаюсь посетить http://myapplication/api/file/2187/filter.jpg, я вижу, что ссылка существует.

Проблема:

Я не мог использовать тот же метод загрузки в. net Только приложение, потому что IActionResult ищет пространство имен Microsoft.AspNet.MVC. Попытался установить элемент <a> в моем приложении asp. net, как показано ниже:

<a href="\\myfolder\myapp\file\2187\filter.jpg" target="_blank">download</a>

Однако это не работает в Chrome, выдавая ошибку: Not allowed to load local resource

Я не смог найти способ создать ссылку на http для файла, как в приложении MVC. Как включить ссылку в приложении, например: http://myapplication/api/file/2187/filter.jpg для использования в href?

Примечание: Загружаемые файлы находятся в общей папке, не могут быть перемещены их в мой локальный P C или не можете импортировать их внутри проекта и т. д. c ..

Примечание 2: После загрузки не должно быть страницы-refre sh файл.

Любая помощь или совет должны быть оценены! Спасибо.

1 Ответ

1 голос
/ 11 февраля 2020

Пути к файлам не должны приниматься из URL или строки запроса:

Я бы настоятельно рекомендовал не использовать filepath в строке запроса или URL. Я вижу в коде, что вы не проверяете filePath и не загружаете файл напрямую. Это может быть очень опасно. Люди могут попробовать загрузить web.config или любой другой файл на ваш веб-сервер, если разрешения не установлены правильно или если нет другого механизма для блокировки такого запроса.

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

Что такое косвенное обращение?

При косвенном обращении вы создаете идентификатор для файла. Это может быть и GUID. Затем вы можете принять этот GUID через QueryString или через URL. Затем в своем действии вы должны сопоставить его с нужным файлом, а затем загрузить его.

Пример кода:

В следующем примере кода используется идентификатор файла.

Когда передается идентификатор файла, он пытается получить сведения о файле в CustomDocumentObj. Эти данные содержат фактический путь к файлу.
Затем можно выполнить проверки, чтобы проверить, является ли это файл, связанный с приложением, и позволяет ли ваше приложение загрузить этот файл.

public class ServiceController : Controller
{
   public ActionResult DownloadFile(string id)
   {
       CustomDocumentObj document = new CustomDocumentObj(Int32.Parse(id));
       // OPTIONAL - validation to check if it is allowed to download this file.
       string filetype = Helpers.GetMimeType(document.FilePath);
       return File(document.FilePath, filetype, Path.GetFileName(document.FilePath));
   }
} 

Тогда в URL это может быть что-то вроде ниже:

<a href="/Services/DownloadFile/1">Download File</a>

См. Этот блог для получения дополнительной информации.

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