使用ASP.NET HttpWebRequest/HttpWebResponse从第三方下载PDF

本文关键字:第三方 下载 PDF HttpWebResponse ASP NET HttpWebRequest 使用 | 更新日期: 2023-09-27 18:26:51

我想发送一个url作为查询字符串,例如

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

并检测上述URL是否返回PDF文件。如果它将返回PDF,则会自动保存,否则会出现错误。

有些页面使用Handler来获取文件,因此在这种情况下,我也想检测并下载相同的文件。

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

上面可能会返回一个pdf文件。

捕捉这一点的最佳方式是什么?

感谢

使用ASP.NET HttpWebRequest/HttpWebResponse从第三方下载PDF

您可以下载类似的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。

如果您要获得一个通用的mime类型,比如application/octet流,那么您必须使用一种更具启发性的方法。

假设你不能简单地使用文件扩展名(例如.aspx),那么你可以先将文件复制到MemoryStream中(请参阅如何从.NET中的Stream中获取MemoryStream?)。一旦你有了文件的内存流,你就可以"厚脸皮"地看一眼(我说厚脸皮是因为这不是解析PDF文件的正确方法)

我不是PDF格式的专家,但我相信用ASCII阅读器读取前5个字符会产生"%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;