我创建了一个用户可以从我的网页下载pdf文件的功能。该文件存储在数据库中,并从webapi请求。 webapi的返回值是byte []。
我的问题是,当我在本地iis上运行Web应用程序时,此功能运行时没有任何错误。我得到pdf文件,它在我的机器上正确下载。但是,当我将Web应用程序部署到我的测试服务器时,此代码生成chrome中的 RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION ,其中包含一些文件,其他文件下载到机器但是当我尝试打开pdf文件时,我得到:无法加载pdf文件。
Chrome和IE都会发生这种情况。
这是我的代码:
[HttpGet]
[DoNotChangeCacheSettings]
public virtual FileResult DownloadTranslationFile(Guid id)
{
Guid assessmentTemplateId = id;
File translationFile = Services.GetFileContent(assessmentTemplateId);
var fileName = HttpUtility.UrlPathEncode(translationFile.FileName);
this.HttpContext.Response.Headers.Add("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
var result = File(translationFile.FileContent.Content, System.Net.Mime.MediaTypeNames.Application.Pdf, fileName);
return result;
}
我一直试图解决这个问题2天但我根本无法弄清问题是什么。希望你们能帮忙。感谢。
答案 0 :(得分:2)
您不需要使用Content-Disposition
。 .Net将为您添加它。来自docs。
fileDownloadName参数用于生成 content-disposition header。由此准备的结果对象 方法是由ASP.NET MVC框架写入响应时的 该对象被执行。可以使用MediaTypeNames类来获取 特定文件扩展名的MIME类型。
我倾向于使用Stream-overload:
[HttpGet]
[DoNotChangeCacheSettings]
public virtual FileResult DownloadTranslationFile(Guid id)
{
Guid assessmentTemplateId = id;
File translationFile = Services.GetFileContent(assessmentTemplateId);
var fileName = HttpUtility.UrlPathEncode(translationFile.FileName);
var stream = = new MemoryStream(translationFile.FileContent.Content);
return File(stream, "application/pdf", fileName);
}
但你也可以使用byte []:
[HttpGet]
[DoNotChangeCacheSettings]
public virtual FileResult DownloadTranslationFile(Guid id)
{
Guid assessmentTemplateId = id;
File translationFile = Services.GetFileContent(assessmentTemplateId);
var fileName = HttpUtility.UrlPathEncode(translationFile.FileName);
return File(translationFile.FileContent.Content, "application/pdf", fileName);
}
修改强> 如果在打开PDF时出错,您可以通过手动从代码中保存PDF来确保Web浏览器正在做正确的事情。如果该文件也有错误,您可能会生成错误的字节[]。
[HttpGet]
[DoNotChangeCacheSettings]
public virtual FileResult DownloadTranslationFile(Guid id)
{
Guid assessmentTemplateId = id;
File translationFile = Services.GetFileContent(assessmentTemplateId);
var fileName = HttpUtility.UrlPathEncode(translationFile.FileName);
var stream = = new MemoryStream(translationFile.FileContent.Content);
// Code for debugging
var tempDir = "C:\\temp"; // Make sure app pool can write here.
var path = Path.Combine(tempDir, fileName); // Possibly add extension here.
using (var fileStream = File.Create(path))
{
stream.Seek(0, SeekOrigin.Begin);
stream.CopyTo(fileStream);
}
stream.Seek(0, SeekOrigin.Begin);
// Return to client.
return File(stream, "application/pdf", fileName);
}