2014-10-16 71 views
0

我想發送一個url作爲查詢字符串,例如使用ASP.NET從第三方下載PDF HttpWebRequest/HttpWebResponse

localhost/abc.aspx?url=http:/ /www.site.com/report.pdf 

並檢測上述URL是否返回PDF文件。如果它將返回PDF,則會自動保存,否則會出錯。

有一些頁面使用處理程序來獲取文件,所以在這種情況下,我也想檢測並下載相同的文件。

localhost/abc.aspx?url=http:/ /www.site.com/page.aspx?fileId=223344 

以上可能會返回一個pdf文件。

什麼是最好的方式來捕捉這個?

感謝

回答

1

你可以下載一個PDF這樣

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri); 
HttpWebResponse response = req.GetResponse(); 
//check the filetype returned 
string contentType = response.ContentType; 
if(contentType!=null) 
{ 
    splitString = contentType.Split(';'); 
    fileType = splitString[0]; 
} 

//see if its PDF 
if(fileType!=null && fileType=="application/pdf"){ 
    Stream stream = response.GetResponseStream(); 
    //save it 
    using(FileStream fileStream = File.Create(fileFullPath)){ 
     // Initialize the bytes array with the stream length and then fill it with data 
     byte[] bytesInStream = new byte[stream.Length]; 
     stream.Read(bytesInStream, 0, bytesInStream.Length);  
     // Use write method to write to the file specified above 
     fileStream.Write(bytesInStream, 0, bytesInStream.Length); 
    } 
} 

response.Close(); 

事實上,它可能來自一個.aspx處理程序不實際的事情,它是啞劇在服務器響應時返回用過的。

如果您正在獲取泛型MIME類型,如application/octet-stream,那麼您必須使用更合理的方法。

假設您不能簡單地使用文件擴展名(例如.aspx),則可以先將該文件複製到MemoryStream(請參閱How to get a MemoryStream from a Stream in .NET?)。一旦你有一個文件的內存流,你可以採取'厚臉皮'偷看它(我說厚顏無恥,因爲它不是解析PDF文件的正確方法)

我不是PDF格式的專家,但我相信讀第5個字符與ASCII閱讀器將產生「%PDF-」,這樣你就可以識別與

bool isPDF; 
using( StreamReader srAsciiFromStream = new StreamReader(memoryStream, 
    System.Text.Encoding.ASCII)){ 
     isPDF = srAsciiFromStream.ReadLine().StartsWith("%PDF-"); 

} 

//set the memory stream back to the start so you can save the file 
memoryStream.Position = 0; 
+0

應用程序/八位字節流的一些網址返回的MIME類型可以有什麼樣的文件。在這種情況下,我們如何檢測pdf? – kamalpreet 2014-10-17 15:39:32

+1

我已更新回答你的問題。 – 2014-10-17 17:28:03

+0

我們如何使用Response.Write()將其作爲Content Typr =「application/pdf」寫在客戶端的瀏覽器上? – kamalpreet 2014-10-18 15:31:10