PDF

2017-01-04 73 views
0

我有一個瀏覽器上顯示從二進制數據PDF一個ASHX處理程序中,我使用的.NET Framework 4.0,IIS 6和Chrome瀏覽器:PDF

 Dim s As System.IO.MemoryStream = HttpContext.Current.Session("tmp_binaryData") 
     s.Seek(0, System.IO.SeekOrigin.Begin) 

     With HttpContext.Current.Response 
      .ClearContent() 
      .ClearHeaders() 
      .ContentType = "application/pdf" 
      .AddHeader("Content-Disposition", "inline; filename='test.pdf'") 
      .BinaryWrite(s.ToArray) 
      .Flush() 
     End With 

訪問時從HTTPS中,用戶嘗試保存文件(點擊PDF查看器工具欄上的保存按鈕),文件保存爲ashx而不是pdf。如果從HTTP(端口80)訪問Web應用程序,則不會發生這種情況。

值得一提的是,如果我將ContentType更改爲「attachment/pdf」,則該文件將自動保存爲PDF。

我已經使用了各種標題組合,沒有成功,禁用了Chrome的PDF查看器,嘗試過Adobe Reader,在IIS上檢查了文件壓縮選項,驗證過MIME類型,僅列出了一些。

作爲附加信息,我在另一臺服務器上的IIS7上託管的另一個Web應用程序上使用了相同的技術,並且問題不存在,所以它與IIS 6配置有關。

UPDATE月/ 05/2017年

我已經通過Response.Redirect("test.pdf")生產服務器上加載從文件測試PDF和文件成功保存在Chrome。所以,我比較了這兩種顯示方式標題:

的Response.Redirect()方法:

headers=" 
Accept-Ranges: bytes 
Content-Length: 696505 
Content-Type: application/pdf 
Date: Thu, 05 Jan 2017 18:05:09 GMT 
ETag: "33dad7f8baccd11:11a1" 
Last-Modified: Wed, 22 Jun 2016 19:19:18 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET" 

ASHX處理程序(filestram)方法:

headers=" 
Cache-Control: private 
Content-Disposition: inline; filename='Prueba.pdf' 
Content-Type: application/pdf 
Date: Thu, 05 Jan 2017 18:09:58 GMT 
Server: Microsoft-IIS/6.0 
Transfer-Encoding: chunked 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET" 

我注意到, ASHX方法缺少「Accept-Ranges」和「Content-Lenght」頭文件,但引起了我的注意,它有「Transfer-Encoding:chunked」頭文件。你認爲這可能導致這個問題?我將嘗試複製ASHX上的第一個方法頭。

回答

0

好吧,我不得不身體在服務器上生成的PDF文件,然後將它與Response.Redirect的()發送給客戶端的瀏覽器:

Dim s As System.IO.MemoryStream = HttpContext.Current.Session("tmp_binaryData")    
Dim serverPath As String = "~/temp/" 

System.IO.File.WriteAllBytes(HttpContext.Current.Server.MapPath(serverPath + HttpContext.Current.Session("tmp_fileName")), s.ToArray()) 
HttpContext.Current.Response.Redirect((serverPath + HttpContext.Current.Session("tmp_fileName"))) 

這些生成的文件需要在會話結束時將被刪除或過期,可以在Global.asax中完成。

另一個workarround將使用原始方法(寫入字節到瀏覽器),而不是點擊保存圖標,用戶將點擊打印按鈕,然後保存PDF文件。