Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 下载PhantomJS生成的pdf时出现问题_C#_Asp.net_Asp.net Mvc_Stream_Phantomjs - Fatal编程技术网

C# 下载PhantomJS生成的pdf时出现问题

C# 下载PhantomJS生成的pdf时出现问题,c#,asp.net,asp.net-mvc,stream,phantomjs,C#,Asp.net,Asp.net Mvc,Stream,Phantomjs,将PhantomJS生成的文件下载到asp.net应用程序时遇到一些问题。 我将phantomJs作为服务器运行: 文件正确生成并保存到PhantomJS文件夹中的磁盘,但是在传输和包含到Http响应流中的过程中发生了一些事情。该文件是由浏览器下载的,但当我试图打开它时,文件错误并显示无法打开的消息。我怀疑它在流传输中被破坏了 我希望避免从文件系统中存储的位置读取pdf,而是从PhantomJS返回的响应中获取它 PhantomJS代码: page.open(url, function (sta

将PhantomJS生成的文件下载到asp.net应用程序时遇到一些问题。 我将phantomJs作为服务器运行: 文件正确生成并保存到PhantomJS文件夹中的磁盘,但是在传输和包含到Http响应流中的过程中发生了一些事情。该文件是由浏览器下载的,但当我试图打开它时,文件错误并显示无法打开的消息。我怀疑它在流传输中被破坏了

我希望避免从文件系统中存储的位置读取pdf,而是从PhantomJS返回的响应中获取它

PhantomJS代码:

page.open(url, function (status) {

    page.render(fullFileName);

    var fs = require('fs');

    var pdfContent = fs.read(fullFileName);
    response.statusCode = 200;
    response.headers = {
                    'Cache': 'no-cache',
                    'Content-Type': 'application/pdf',
                    'Connection': 'Keep-Alive',
                    'Content-Length': pdfContent.length
                    };

     response.setEncoding("binary");
     response.write(pdfContent);


});
ASP.NET代码:

public ActionResult DownloadPdfFromUrl(ConvertionModel model)
    {
        HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create("http://localhost:8080");

        ASCIIEncoding encoding = new ASCIIEncoding();
        string postData = string.Format("url={0}&fileName=myTest&extension=pdf&format=pdf", model.UrlToConvertPdf);
        byte[] data = encoding.GetBytes(postData);

        httpWReq.Method = "POST";
        httpWReq.ContentType = "application/x-www-form-urlencoded";
        httpWReq.ContentLength = data.Length;

        using (Stream s = httpWReq.GetRequestStream())
        {
            s.Write(data, 0, data.Length);
        }

        var response = (HttpWebResponse)httpWReq.GetResponse();

        Response.AppendHeader("Content-Disposition", "attachment;filename=test.pdf");

        return new FileStreamResult(response.GetResponseStream(), "application/pdf");
    }
C代码看起来不错,但最好不要返回空操作结果。我最好写信

var stream = response.GetResponseStream();

var buffer = new byte[response.ContentLength];
stream.Read(buffer, 0, buffer.Length);

return File(buffer, "application/pdf", "test.pdf");
在编写文档正文之前,还要在PhantomJS中设置响应编码:

response.setEncoding("binary");
response.write(pdfContent);

是的,我更新了它以返回一个FileStreamResult,以避免缓冲区解析/null返回值,我正在使用binary选项进行实验(更新的问题)。通过该设置,我可以打开下载的pdf,但它会以空白pdf打开,只有一个白色背景。下载的pdf是否具有与服务器上生成的pdf相同的大小和内容?不,它们不同,服务器上的pdf要大2 Kb。我假设这是一个编码问题导致它被破坏,PhantomJS返回的内容长度是否等于服务器端文件大小?可能
fs.read(文件名)
将其读取为文本,因此需要
fs.open(文件名'rb').read()
将其读取为二进制流。