无法在web api中加载PDF文档

时间:2016-05-02 09:48:29

标签: c# jquery asp.net asp.net-web-api dotnetnuke

我在下载和打开pdf文件时遇到错误

  

无法加载PDF文档

。但是当我尝试下载txt文件时,它会完全下载成功。我需要这个ajax请求作为POST方法,所以在网上搜索后我发现了这段代码。

$.ajax({
type: "POST",
url: url,
cache: false,
contentType: false,
processData: false,
success: function (data) {

    var blob = new Blob([data]);
    var link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    link.download = textName;
    link.click();
}, error: function (data) { alert("error"); }});

我使用web api下载文件

public HttpResponseMessage Download(string fileName)
{   
    string filePath = Path.Combine(PATH, fileName.Replace('/', '\\'));
    byte[] pdf = System.IO.File.ReadAllBytes(filePath);
    HttpResponseMessage result = Request.CreateResponse(HttpStatusCode.OK);
    result.Content = new ByteArrayContent(pdf);
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
    result.Content.Headers.ContentDisposition.FileName = "MyPdf.pdf";
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
    return result;
}

请帮帮我

2 个答案:

答案 0 :(得分:0)

引用Download pdf file using jquery ajax

  

jQuery在使用AJAX请求加载二进制数据时遇到了一些问题   尚未实现某些HTML5 XHR v2功能

它为您提供了两种选择。我不会在这里重复它们,因为它们属于那个答案。检查链接。

在服务器端,我已成功使用此方法下载PDF文件。

[HttpPost]
public HttpResponseMessage Download(string fileName)
{   
    string filePath = Path.Combine(PATH, fileName.Replace('/', '\\'));
    byte[] pdf = System.IO.File.ReadAllBytes(filePath);
    //content length for header
    var contentLength = pdf.Length;
    var statuscode = HttpStatusCode.OK;
    var result = Request.CreateResponse(statuscode);
    result.Content = new StreamContent(new MemoryStream(buffer));
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
    result.Content.Headers.ContentLength = contentLength;
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
    result.Content.Headers.ContentDisposition.FileName = "MyPdf.pdf";

    return result;
}

与原作没有太大区别。

如果从磁盘/数据库读取或者动态生成文件,还应检查以确保服务器上的原始文件没有损坏。

答案 1 :(得分:0)

问题可能是您的Content-Disposition标头。你需要内联,但你有附件。

result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("inline");

您现在所拥有的内容告诉浏览器直接发送文件,而不是尝试在浏览器中显示它。当你这样做时,Chrome的内部PDF查看器会出现阻塞。

更多:Content-Disposition:What are the differences between "inline" and "attachment"?