【问题标题】:Issues when downloading PDF file from MVC application从 MVC 应用程序下载 PDF 文件时的问题
【发布时间】:2016-10-07 06:41:13
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您不需要使用Content-Disposition。 .Net 将为您添加它。来自docs

    fileDownloadName 参数用于生成 内容处置标头。由此准备的结果对象 当 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);
    }
    

    【讨论】:

    • 成功了。现在我可以将文件下载到我的硬盘上。但是文件是1KB,应该是800kb左右。因此,当我尝试打开 pdf 文件时出现此错误。 prntscr.com/bdqv53这不会在本地发生。
    • 感谢您的帮助。非常感谢。
    • 我想我已经将错误定位在包含该文件的 web api 中。我尝试在谷歌邮递员中输入网址,我得到了开发环境的回复。但是当插入测试环境的 url 时,我得到一个“服务不可用”错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多