Возврат MVC FileContentResult для загрузки файла .pdf из - PullRequest
2 голосов
/ 05 мая 2011

Привет, я довольно долго искал это, но я не нашел ситуацию, которая действительно напоминала бы мою ... надеюсь, я не пропустил где-нибудь дубликат

Цель: вернуть файл изобщий ресурс UNC для клиента в качестве опции загрузки / открытия.

Информация: общий ресурс расположен на сервере, отличном от того, на котором размещен веб-сайт.При щелчке по соответствующему имени папки в меню я могу успешно прочитать из общей папки (я возвращаю файлы как результат JSON), а в Jquery я добавляю элементы списка для каждого файла, найденного в папке, и делаю элемент спискаID это имя файла.Это прекрасно работает.

Когда щелкают эти элементы добавленного списка, я передаю их идентификаторы (которые представляют собой имя файла, например, "thefile.pdf") следующему контроллеру, который возвращает FileContentResult.

files[0].ToString() ниже аналогично "\ server \ folder \"

public ActionResult OpenTheFile(string id)

{

List<string> files = new List<string>();

files.AddRange(Directory.GetFiles(LNFiles.ThePath, id, SearchOption.AllDirectories));

Response.AppendHeader("Content-Disposition", "attachment; filename=" + id + ";");

return File(files[0].ToString(), System.Net.Mime.MediaTypeNames.Application.Pdf, id);

}

И да, обязательно "работает на моей локальной машине".При развертывании на сервере IIS 7.5 и нажатии на элемент списка появляется ошибка YSOD:

Неверный дескриптор.(Исключение из HRESULT: 0x80070006 (E_HANDLE))

Я выдаю себя за пользователя с правами на общий файловый ресурс ... Я в растерянности, я что-то думал с кодировкой или испортилправа?Я попытался использовать виртуальный каталог вместо этого, но увы та же проблема.

Ответы [ 3 ]

3 голосов
/ 12 июня 2012

В моем случае

изменив это:

public ActionResult Download(int id)
    {
        var item = ItemRepo.GetItemById(id);
        string path = Path.Combine(Server.MapPath("~/App_Data/Items"), item.Path);
        return File(path, "application/octetstream", item.Path);
    }

на следующее:

public ActionResult Download(int id)
    {
        var item = ItemRepo.GetItemById(id);
        string path = Path.Combine(Server.MapPath("~/App_Data/Items"), item.Path);
        return File(new FileStream(path, FileMode.Open), "application/octetstream", item.Path);
    }

сработало.Я помещаю это здесь на всякий случай.

1 голос
/ 08 мая 2011

Благослови вас Бог: ProgRockCode.

и так как это включало ActionResult, я написал собственный ActionResult, который использовал метод «WriteFile».

   public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.WriteFile(FilePath, true);
        context.HttpContext.Response.End();
    }
1 голос
/ 05 мая 2011

Проверьте это для обхода Возможно, вы захотите попробовать захват пакета, чтобы увидеть, если вы получаете ту же проблему, как описано здесь: http://forums.asp.net/t/1473379.aspx/1

Для вашего пути unc - вы напрямую ссылаетесь на \ servername \ share или используете букву сетевого подключенного диска?

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