从MVC应用程序

时间:2016-06-07 11:24:04

标签: c# .net asp.net-mvc-3 pdf model-view-controller

我创建了一个用户可以从我的网页下载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天但我根本无法弄清问题是什么。希望你们能帮忙。感谢。

1 个答案:

答案 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);
}