none
Сохранение pdf полученного с помощью webrequest RRS feed

  • Вопрос

  •             var request = WebRequest.Create(@"http://10..../print.php");
                request.Method = "POST";
                request.Timeout = 120000;
                request.ContentType = "application/x-www-form-urlencoded";
                byte[] sentData = Encoding.UTF8.GetBytes("xml_data=<?xml version=\"1.0\"?><printListStick><wblnum>13-6581-2613</wblnum><item></item><type>2</type></printListStick>");
                request.ContentLength = sentData.Length;
                var sendStream = request.GetRequestStream();
                sendStream.Write(sentData, 0, sentData.Length);
                sendStream.Close();
    
                var response = request.GetResponse();
    
                var stream = response.GetResponseStream();
                var array = new byte[response.ContentLength];
                stream.Read(array, 0, array.Length);
                response.Close();
    
    
                FileStream file = new FileStream(@"D:\E388692D-8C0C-4710-86DB-E77E0B2CB2CE.pdf", FileMode.Create);
                file.Write(array, 0, array.Length);
                file.Close();
    

    Делаю веб запрос в ответ которого формируется PDF-файл, который я записываю на диск. Файл почему-то не открывается Адобом, сообщение, что он испорчен. Хотя, если я тот же запрос делаю в браузере и сохраняю из него файл, то он полностью совпадает по размеру с файлом получаемым программно и нормально открывается.

    В чем может быть проблема?

Ответы

Все ответы

  • Проблема однозначно в байтах, неверно они интерпретируются. Нужно точно знать, что возвращает веб-ресурс, если бинарные данные файла пишутся прямо в поток ответа, то можно сделать попроще. Использовать класс System.Net.WebClient, его метод DownloadFile.

    Сделаем содержимое сообщества лучше, вместе!

    Модератор
  • Спасибо, мысль хорошая, но я не понимаю, как мне POST запрос сделать в этом случае...
  • Добрый день, проверьте Content-Encoding.

    Приведу часть кода для HttpWebResponse

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        if (response.StatusCode == HttpStatusCode.OK)
                        {
                            cookieContainer = request.CookieContainer;
                            if (response.Headers.Get("Content-Encoding") != null && response.Headers.Get("Content-Encoding").ToLower() == "gzip")
                            {
                                using (StreamReader sr = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress)))
                                {
                                    respstr = sr.ReadToEnd();
                                }
                            }
                            else
                            {
                                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                                {
                                    respstr = sr.ReadToEnd();
                                }
                            }
                        }
                    }
    
    Реализация немного другая, но принцип один - проверьте на gzip сжатие.

  • "как мне POST запрос сделать в этом случае..." - в этом уже никак.

    Сделаем содержимое сообщества лучше, вместе!

    Модератор