Что бы я сделал, короткая история:
Когда пользователь нажимает кнопку «Загрузить», используйте AJAX для асинхронного вызова страницы обработки.На этой странице будет сгенерирован ваш документ Excel, который будет храниться во временном местоположении
Когда запрос AJAX будет выполнен, скройте панель «Загрузка» и перенаправьте пользователя на страницу загрузки.В идеале вы должны перенаправить на общий (.ashx) обработчик, который открывает файл, устанавливает некоторые заголовки, передает временный файл пользователю и впоследствии удаляет файл.
Сейчас вподробнее:
Для первого шага у вас должна быть временная папка, к которой у вас есть права на чтение и запись.Использование системной временной папки - это нормально, поэтому вы можете использовать Path.GetTempFileName
.Вот пример того, что вы могли бы написать в обработчике ashx:
public class Handler1 : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
string fName = Path.GetTempFileName();
context.Response.ContentType = "text/plain";
try
{
// Generate the Excel document
GenerateExcelInFile(fName);
// Store the file name in session for later use
context.Session["ExcelGeneratorFileName"] = fName;
// Send confirmation to the client
context.Response.Write("ok");
}
catch (Exception e)
{
context.Response.Write("error");
// TODO : Do some logging
}
}
// SNIP : IsReusable
}
После этого используйте ваш любимый JS-фреймворк для запроса этого обработчика и протестируйте возвращенную строку.Если все в порядке, вы вызываете обработчик второй части:
public class Handler2 : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/excel";
// Make sure the browser will show a "save as" dialog to the user
context.Response.AddHeader("content-disposition", "attachment; filename=Export.pdf");
string fName = context.Session["ExcelGeneratorFileName"] as String;
if (fName != null && File.Exists(fName))
{
// Stream the excel file to the response
context.Response.WriteFile(fName);
// Remove the file
File.Delete(fName);
}
}
// SNIP : IsReusable
}
Вы можете вызвать эту страницу в javascript просто используя window.location = url
.Заголовок размещения контента сообщит браузеру, что этот URL-адрес не должен отображаться, только загружаться, поэтому ваш пользователь должен оставаться на странице загрузки.