Загрузка pdf-файла с помощью WebRequests
Я пытаюсь загрузить несколько pdf-файлов автоматически с учетом списка URL-адресов.
вот код, который у меня есть:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
var encoding = new UTF8Encoding();
request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-gb,en;q=0.5");
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0";
HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
BinaryReader reader = new BinaryReader(resp.GetResponseStream());
FileStream stream = new FileStream("output/" + date.ToString("yyyy-MM-dd") + ".pdf",FileMode.Create);
BinaryWriter writer = new BinaryWriter(stream);
while (reader.PeekChar() != -1)
{
writer.Write(reader.Read());
}
writer.Flush();
writer.Close();
Итак, я знаю, что первая часть работает. Я изначально получал его и читал его с помощью TextReader-но это дало мне поврежденные pdf-файлы (поскольку PDF-файлы являются двоичными файлами).
прямо сейчас, если я запустил его, читатель.PeekChar () всегда -1 и ничего не происходит - я получаю пустой файл.
при отладке я заметил, что читатель.Read () фактически давал разные номера, когда я его вызывал, поэтому, возможно, Peek сломан.
поэтому я попробовал что-то очень грязное
try
{
while (true)
{
writer.Write(reader.Read());
}
}
catch
{
}
writer.Flush();
writer.Close();
Теперь я получаю очень крошечный файл с некоторым мусором в нем, но это все еще не то, что я ищу.
Итак, кто-нибудь может указать мне в правильном направлении?
Дополнительная Информация:
заголовок не предлагает его сжатый или что-либо еще.
HTTP/1.1 200 OK
Content-Type: application/pdf
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Fri, 10 Aug 2012 11:15:48 GMT
Content-Length: 109809
4 ответов
пропустить BinaryReader
и BinaryWriter
и просто копирует входной поток в выходной FileStream
. Кратко
var fileName = "output/" + date.ToString("yyyy-MM-dd") + ".pdf";
using (var stream = File.Create(fileName))
resp.GetResponseStream().CopyTo(stream);
почему бы не использовать WebClient
класса?
using (WebClient webClient = new WebClient())
{
webClient.DownloadFile("url", "filePath");
}
Ваш вопрос спрашивает о WebClient
но ваш код показывает, вы используете необработанные HTTP-запросы и Resposnses.
почему бы вам на самом деле не использовать System.Net.WebClient
?
using(System.Net.WebClient wc = new WebClient())
{
wc.DownloadFile("http://www.site.com/file.pdf", "C:\Temp\File.pdf");
}
частный недействительными методе form1_load(объект отправителя, EventArgs в электронной) {
WebClient webClient = new WebClient();
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
webClient.DownloadFileAsync(new Uri("https://www.colorado.gov/pacific/sites/default/files/Income1.pdf"), @"output/" + DateTime.Now.Ticks ("")+ ".pdf", FileMode.Create);
}
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
progressBar = e.ProgressPercentage;
}
private void Completed(object sender, AsyncCompletedEventArgs e)
{
MessageBox.Show("Download completed!");
}
}
}