Я провожу весь день, пытаясь заставить браузер открывать PDF-файлы, а не загружать его с помощью System.Web.Mvc.FileResult
, и я сделал это по старинке System.Web.Response, как это:
Контроллер
//StaticData.ReportsTemp it's my type of Dictionary<string,object>
public async Task<ActionResult> GenerateReport() {
//some code
var tempGuid = Guid.NewGuid().ToString();
StaticData.ReportsTemp[tempGuid] = File(strem, obj.MediaType, obj.name);
return Content(opertionGuid);
}
public FileResult DownloadReport(string fileName) {
FileResult result = null;
FileStreamResult st = null;
if (StaticData.ReportsTemp.ContainsKey(fileName)) {
st = StaticData.ReportsTemp[fileName] as FileStreamResult;
result = st;
StaticData.ReportsTemp.Remove(fileName);
if (st.ContentType == System.Net.Mime.MediaTypeNames.Application.Pdf || 1 == 1) { //Old fashion way
byte[] buff = null;
System.IO.BinaryReader br = new System.IO.BinaryReader(st.FileStream);
buff = br.ReadBytes((int) st.FileStream.Length);
Response.BinaryWrite(buff);
Response.AddHeader("content-length", buff.Length.ToString());
Response.ContentType = st.ContentType;
Response.AddHeader("Content-Disposition", "inline; filename=" + st.FileDownloadName + ";");
return null;
}
}
return result;
}
JS
function onSuccess(data, status, xhr) {
window.open("@Url.RouteUrl(new { Controller = "Main", Action = "DownloadReport" })?filename=" + xhr.responseText,'_brank');
}
Мой процесс загрузки разделен на два этапа:
- 1) Я создаю отчет, создаю FileStremResult, сохраняю его в словарь StaticData.Reports и возвращаю ключ словаря клиенту
- 2), используя ключ словаря, полученный на шаге 1. Я вызываю действие Download, которое возвращает FileStremResult из StaticData.Словарь отчетов
PDF открываются в браузере, а все остальные файлы по-прежнему просто загружаются.
Но мне все еще интересно, есть ли другой способ добиться этого?Есть ли способ сделать это с классами System.Web.Mvc ActionResult?