2012-05-16 3 views
2

У меня есть универсальный обработчик, который я называю, используя этот очень простой код JS:ответ Перенаправление для загрузки файла

var formData = new FormData(); 

    formData.append("fileId", this.model.get("id")); 

    xhr = new XMLHttpRequest(); 

    xhr.open('POST', '/genericHandlers/DownloadFile.ashx'); 

    xhr.onload = function() { 
     if (xhr.status === 200) { 
      // Do something here? 
     } 
    } 

    xhr.send(formData); 

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

Handler Код:

var fileId = context.Request.Form["fileId"]; 

    // File stored in the db as a byte array 

    var file = (from f in dataContext.OneEVA_Docs_File_Storages 
      where Equals(f.ID, fileId) 
      select f).FirstOrDefault(); 

    context.Response.Clear(); 

    context.Response.AddHeader("Content-Type", file.ContentType); 
    context.Response.AddHeader("Content-Length", file.ContentLength.ToString()); 

    context.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}; size={1}", file.Name, file.ContentLength)); 

    context.Response.BinaryWrite(file.File_Image.ToArray()); 
    context.Response.Flush(); 

    context.Response.End(); 

Запрос XHR завершает нормально. Вот заголовок ответа, который я возвращаю:

Cache-Control:private 
Connection:Close 
Content-Disposition:attachment; filename=Mikes File; size=1860113 
Content-Length:1860113 
Content-Type:image/jpeg 
Date:Wed, 16 May 2012 14:08:01 GMT 
Server:ASP.NET Development Server/10.0.0.0 
X-AspNet-Version:4.0.30319 

Что мне не хватает? Что я делаю не так?

+0

В чем проблема? Не попадает ли файл в ответ? – sinni800

+0

@ sinni800 Он просто возвращается, без загрузки. –

ответ

1

Это не будет запускать загрузку в браузере. Трудно достичь использования запроса POST. Может ли это быть GET-запрос, если вы передаете только идентификатор? Тогда вы просто сделаете

document.location.href = '/genericHandlers/DownloadFile.ashx?id=' + this.model.get("id"); 
+0

Это отлично работает. Спасибо. Можете ли вы увидеть недостаток использования 'GET', а не' POST' в этой ситуации? –

+0

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

+0

@MikeFielden Вы можете - если файл не существует, просто выполните страницу с ошибкой или перенаправьте вместо загрузки. Конечно, это означает, что вы покидаете страницу. Возможно, проверьте свой файл до того, как вы дадите своим пользователям ссылку, чтобы нажать. –