2013-07-06 5 views
3

У меня возникли проблемы с загрузкой сгенерированного файла PhantomJS в мое приложение asp.net. Я запускаю phantomJs как сервер: Файл создается корректно и сохраняется на диске в папке PhantomJS, но что-то происходит во время передачи и включения в поток ответов HTTP. Файл загружается браузером, но когда я пытаюсь его открыть, ошибки файла с сообщением, что он не может быть открыт. Я подозреваю, что он поврежден в потоковой передаче?Проблемы с загрузкой PhantomJS pdf

Я хотел бы избежать чтения 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"); 
    } 

ответ

1

Код 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); 
+0

Да я обновил его, чтобы вернуть FileStreamResult, чтобы избежать буфера парсинга/нулевое значение, возвращаемое – TGH

+0

я experiementing с двоичной опцией (обновленный вопрос). С этой настройкой я могу открыть загруженный pdf-файл, но он открывается как пустой pdf с только белым фоном. – TGH

+0

И загружает ли pdf-файл того же размера и контента, что и на сервере? –

Смежные вопросы