Как заставить загрузку в MVC2? - PullRequest
2 голосов
/ 16 ноября 2010

У меня есть PDF, и я хочу предложить пользователю простую ссылку "Скачать".Как это можно сделать?

Моя идея
- вычислить URL-адрес PDF-документа на стороне сервера и сохранить его в «viewmodel.PDFURL»,
- добавить <a href=...> впредставление, которое вызывает функцию.
- Эта функция будет использовать

$.post("ForcePDFDownload", { PDFURL: <%: Model.PDFURL %> } );

для вызова этого метода на стороне сервера:

[HttpPost]
public JsonResult ForcePDFDownload(string PDFURL)
{
    string path = Path.GetFullPath(PDFURL);
    string filename = Path.GetFileName(PDFURL);
    Response.AppendHeader("content-disposition", "attachment; filename=" + filename);
    Response.ContentType = "application/pdf";
    Response.WriteFile(path);
    Response.End();

    return null;
}

Но return null; не имеет смысла для меня, нометод должен что-то возвращать, иначе Visual Studio не скомпилирует ...

Есть идеи?

Заранее спасибо!

1 Ответ

3 голосов
/ 16 ноября 2010

Нет необходимости использовать JSON, AJAX, JQuery или что-то еще. Просто:

public ActionResult ForcePDFDownload(string PDFURL)
{
    string path = Path.GetFullPath(PDFURL);
    string filename = Path.GetFileName(PDFURL);
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + filename);
    return File(path, "application/pdf");
}

А затем создайте ссылку:

<%: Html.ActionLink("Download PDF", "ForcePDFDownload", new { PDFURL = Model.PDFURL }) %>

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

http://foo.com/somecontroller/forcepdfdownload/?pdfurl=c%3A%5Cmycreditcardnumbers.txt

и жить счастливо до конца своей жизни: -)

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