Загрузка файла на клиент в приложении ASP.NET MVC с использованием JQuery - PullRequest
1 голос
/ 22 июня 2009

У меня есть контроллер ASP.NET MVC с методом, который должен подавать файл клиенту (браузеру). Действие контроллера вызывается с помощью вызова JQuery $ .ajax. Пользователю необходимо предложить загрузить файл после завершения действия контроллера.

Я использовал Response.Transmitfile / Response.WriteFile в методе контроллера, но оба не предложили мне загрузить файл в браузере IE, хотя файл был создан, и я также использую правильный путь к файлу.

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

Может ли кто-нибудь дать мне знать, если чего-то не хватает в этом потоке?

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

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult CreatePresentation(string id)
    {
     //do something here , create the file and place in a location on the server itself
       string filename = Path.GetFileName(filePath);
        Response.ContentType = "APPLICATION/OCTET-STREAM";
        System.String disHeader = "Attachment; Filename=\"" + filename +
           "\"";
        Response.AppendHeader("Content-Disposition", disHeader);
        FileInfo fileToDownload = new FileInfo(filePath);
        Response.WriteFile(fileToDownload.FullName);
    }

На стороне Javascript, вот как я вызываю действие контроллера

function CreatePresentation()
{ 
// something here
     $.ajax({
   type: "POST",
   url: "http://localhost:4844/ActionBar/CreatePresentation",
   data:data
 });
} // end of function

1 Ответ

1 голос
/ 22 июня 2009

когда вы используете $.ajax, или в этом отношении любой другой механизм AJAX, вы обходите нормальный конвейер передачи файлов браузера. Это главный конвейер, который запускает диалог браузера Save This File, а не AJAX.

Чтобы достичь того, что вы хотите, вам нужно использовать синхронное изменение местоположения, а не асинхронное: вместо использования $.ajax, просто установите document.location:

function CreatePresentation()
{
    //snip code that creates a map called "data"
    var paramSnippets = [];
    for (item in data)
    {
        paramSnippets.push(item + "="+data[item]);
    }

    document.location = "http://localhost:4844/ActionBar/CreatePresentation" + "?" + paramSnippets.join("&");
}

отредактировано в ответ на комментарии: включенный пример

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