MVC скачать файл за пределами папки приложения - PullRequest
0 голосов
/ 18 января 2011

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

public FilePathResult DownloadFile(Guid id, string dateiname)
    {
        string pfad = @"D:\wwwroot\portal_Daten\";

        return File(pfad + dateiname, "application/pdf", dateiname);
    }

Сообщение об ошибке: это D: \ wwwroot \ portal_Daten \ 8/0/6 / a / e / 974-aaca-426c-b7fc-e6af6c0fb52e / oeffentlich - это физический путь, но ожидался виртуальный путь.

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

С уважением, float

Ответы [ 2 ]

2 голосов
/ 18 января 2011

Способ, которым я обработал этот путь, заключается в использовании специального обработчика загрузки файлов http (для приложения asp.net webforms), и вы можете использовать его здесь. Вы даже можете создать новый подкласс ActionResult, который может принести вам тот же результат.

Способ, которым я это сделал, - создать реализацию IHttpHandler, обработать запрос и вернуть файл. Таким образом, вы не ограничены использованием виртуальных путей и, если позволяет конфигурация безопасности вашего веб-сервера, вы сможете получить доступ к любому файлу в вашей системе и вернуть его в браузер.

Что-то вроде:

public class MyFileHandler : IHttpHandler
{
  public bool IsReusable
  {
    get { return true; }
  }

  public void ProcessRequest(HttpContext context)
  {
    string filePath = Path.Combine(@"d:\wwwroot\portal_daten", context.Request.QueryString["dateiname"]);

    context.Response.ContentType = "application/pdf";
    context.Response.WriteFile(filePath);
  }
}

Сокращенный пример без проверки, но вы должны заполнить его. Затем зарегистрируйте обработчик в своем файле web.config:

<handlers>
  <add name="MyFileHandler" path="file.axd" type="MvcApplication4.Models.MyFileHandler" verb="GET" />
</handlers>

Вам, конечно, придется переименовывать классы / пространства имен в соответствии с вашими потребностями. Фактическая веб-ссылка на файл становится:

http://[domain]/file.axd?dateiname=mypdf.pdf

Где [домен] - это ваше доменное имя / localhost или что вы используете.

0 голосов
/ 18 января 2011

вам нужно использовать Server.MapPath и указать ему местоположение файла, чтобы он мог сопоставить путь с относительным каталогом на сервере

, чтобы что-то вроде

public FilePathResult DownloadFile(Guid id, string dateiname)
{
    string pfad = Server.MapPath(@"D:\wwwroot\portal_Daten\");

    var filePath = Path.Combine(pfad, dateiname);
    return File(filePath , "application/pdf", dateiname);
}

работало

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