2012-01-09 2 views
1

У меня есть контроллер с двумя страницами, указатель и загрузка, при нажатии на загрузку он извлекает байт [] из службы, и я использую Response.BinaryWrite для сохранения файл. Проблема заключается в том, что при использовании Response.Clear он останавливает страницу загрузки из рендеринга, но загружает файл успешно. Есть ли способ загрузить файл и отобразить страницу?Практическое руководство. Сохранение файла из веб-службы без остановки страницы из рендеринга

Я использую .NET 4, ASP, Монорельс замок, C#

Я знаю, что с помощью MVC я могу использовать ActionResult и FileResult как типы возвращаемых для моих взглядов, я тем не менее ограничен использованием Замок Monorail из-за того, что это существующий проект, который я недавно приобрел, и не имею никакого веса в изменении его технологии.

Ниже приведен мой пример кода

public class MyController : Controller 
{ 
    public void Index() 
    { 
     PropertyBag["includeZeroBalances"] = false; 
     PropertyBag["toDate"] = DateTime.Today.ToShortDateString(); 
    } 

    public void Download(bool includeZeroBalances, DateTime toDate) 
    { 
     MyProxy proxy = GetProxy(); 
     byte[] file = proxy.GetFile(includeZeroBalance, toDate); 
     Response.Clear(); 
     Response.ContentType = "application/zip"; 
     Response.AppendHeader("Content-Disposition", "attachment; filename="TestFileName.zip"); 
     Response.BinaryWrite(file); 
    } 
} 

Здесь индекс страницы

${Form.FormTag({@action: 'Download'})} 
    <table> 
     <tr> 
      <td>${Form.LabelFor("toDate", "To Date (yyyy/mm/dd):")}</td> 
      <td><input type="text" id="toDate" name="toDate" value="${?toDate}" /></td> 
     </tr> 
     <tr> 
      <td>${Form.LabelFor("includeZeroBalances", "Include Zero Balances:")}</td> 
      <td>${Form.CheckboxField("includeZeroBalances")}</td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td>${Form.Submit("Download", {@class: 'submitb'})}</td> 
     </tr> 
    </table> 
${Form.EndFormTag()} 

Здесь загрузка страницы

<table> 
    <tr> 
     <td>Your file has been downloaded successfully</td> 
    </tr> 
</table> 

ответ

1

Ответ, который я придумал не столь общим, как мне бы хотелось, но это решение является функциональным.

public class MyController : Controller 
{ 
    public void Index() 
    { 
     PropertyBag["includeZeroBalances"] = false; 
     PropertyBag["toDate"] = DateTime.Today.ToShortDateString(); 
    } 

    public void Download(bool includeZeroBalances, DateTime toDate) 
    { 
     MyProxy proxy = GetProxy(); 
     byte[] file = proxy.GetFile(includeZeroBalance, toDate); 
     PropertyBag["downloadurl"] = "data:application/zip;base64," + System.Convert.ToBase64String(file); 
    } 
} 

Здесь Главная страница

${Form.FormTag({@action: 'Download'})} 
    <table> 
     <tr> 
      <td>${Form.LabelFor("toDate", "To Date (yyyy/mm/dd):")}</td> 
      <td><input type="text" id="toDate" name="toDate" value="${?toDate}" /></td> 
     </tr> 
     <tr> 
      <td>${Form.LabelFor("includeZeroBalances", "Include Zero Balances:")}</td> 
      <td>${Form.CheckboxField("includeZeroBalances")}</td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td>${Form.Submit("Download", {@class: 'submitb'})}</td> 
     </tr> 
    </table> 
${Form.EndFormTag()} 

Вот страница загрузки

<table> 
    <tr> 
     <td>Your file has been generated successfully. <a href="${downloadurl}">Click here</a> to download your file</td> 
    </tr> 
</table> 

Можно также добавить JavaScript для автоматизации загрузки файла в новом окне.

document.Ready(function() 
{ 
    window.open("${downloadurl}"); 
}); 

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

Недостатки использования этой методологии для сохранения файлов: Не достаточно общего для использования в любом браузере любой версии. Если используется для статических файлов, когда файл изменяется, uri необходимо будет сгенерировать снова, так как содержимое файла встроено в uri.

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

1

'правильный' способ сделать это было бы используя множественные ответы, к сожалению some browsers don't support them.

Что вы можете сделать, это использовать мета обновления, такие как sourceforge и другие сайты. Для альтернатив, чтобы эти вопросы:

+0

Привет Маурисио, спасибо вам за ссылки и прозрение, которое вы предоставили. К сожалению, это было не совсем то, что я искал. –

+0

@ROFFELPOMP: ну, это именно то, что вы сделали в своем ответе. –