Файлы c #, загруженные с помощью httpwebrequest, и файлы cookie повреждены - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь создать программу, которая может загружать файлы с URI (URL), используя httpwebrequest и файлы cookie (для получения учетных данных для сохранения статуса входа в систему).

Я могу загружать файлы со следующим кодом, но файлыполучить поврежден после загрузки.

когда я загружаю файл xlsx (на веб-странице) в текстовый файл на локальном диске, я вижу некоторую часть цифр и слов из исходного файла в поврежденном файле, поэтому я предполагаю, что достиг правогофайл.

однако, когда я загружаю файл xlsx (на веб-странице) в файл xlsx на локальный диск, кажется, что он не открывается, говоря, что

excel не может открыть файл'filename.xlsx', поскольку формат файла или расширение файла недопустимы.Убедитесь, что файл не был поврежден и что расширение файла соответствует формату файла.

Есть ли способ сохранить полностью оригинальный контент файла после загрузки?

Я также прилагаю часть содержимого результатов.

private void btsDownload_Click(object sender, EventArgs e)
{
  try
  {
    string filepath1 = @"PathAndNameofFile.txt";                     
    string sTmpCookieString = GetGlobalCookies(webBrowser1.Url.AbsoluteUri);            
    HttpWebRequest fstRequest = (HttpWebRequest)WebRequest.Create(sLinkDwPage);
    fstRequest.Method = "GET";                                                          
    fstRequest.CookieContainer = new System.Net.CookieContainer();                      
    fstRequest.CookieContainer.SetCookies(webBrowser1.Document.Url, sTmpCookieString);
    HttpWebResponse fstResponse = (HttpWebResponse)fstRequest.GetResponse();            
    StreamReader sr = new StreamReader(fstResponse.GetResponseStream());                
    string sPageData = sr.ReadToEnd();                                                  
    sr.Close();                                                                         

    string sViewState = ExtractInputHidden(sPageData, "__VIEWSTATE");                   
    string sEventValidation = this.ExtractInputHidden(sPageData, "__EVENTVALIDATION");  

    string sUrl = ssItemLinkDwPage;                                                  
    HttpWebRequest hwrRequest = (HttpWebRequest)WebRequest.Create(sUrl);
    hwrRequest.Method = "POST";                                                         

    string sPostData = "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=" + sViewState + "&__EVENTVALIDATION=" + sEventValidation + "&Name=test" + "&Button1=Button";


    ASCIIEncoding encoding = new ASCIIEncoding();
    byte[] bByteArray = encoding.GetBytes(sPostData);
    hwrRequest.ContentType = "application/x-www-form-urlencoded";

    Uri convertedURI = new Uri(ssDwPage);
    hwrRequest.CookieContainer = new System.Net.CookieContainer();
    hwrRequest.CookieContainer.SetCookies(convertedURI, sTmpCookieString);

    hwrRequest.ContentLength = bByteArray.Length;
    Stream sDataStream = hwrRequest.GetRequestStream();
    sDataStream.Write(bByteArray, 0, bByteArray.Length);
    sDataStream.Close();
    using (WebResponse response = hwrRequest.GetResponse())
    {
      using (sDataStream = response.GetResponseStream())
      {
        StreamReader reader = new StreamReader(sDataStream);
        {
          string sResponseFromServer = reader.ReadToEnd();
          FileStream fs = File.Open(filepath1, FileMode.OpenOrCreate, FileAccess.Write);

          Byte[] info = encoding.GetBytes(sResponseFromServer);

          fs.Write(info, 0, info.Length);
          fs.Close();

          reader.Close();
          sDataStream.Close();
          response.Close();
        }
      }
    }
  }
  catch
  {
    MessageBox.Show("Error");
  }
}

enter image description here

1 Ответ

0 голосов
/ 05 июня 2018

StreamReader предназначен для работы с текстом данных.Использование его повреждает ваши двоичные данные (файл Excel) .

Запись sDataStream непосредственно в файл.Например

sDataStream.CopyTo(fs)

PS: я подготовил тестовый пример ( с использованием аналогичной логики ), чтобы показать, как ваш код не работает

var binaryData = new byte[] { 128,255 };
var sr = new StreamReader(new MemoryStream(binaryData));
var str3 = sr.ReadToEnd();
var newData = new ASCIIEncoding().GetBytes(str3); //<-- 63,63

Просто сравните двоичные данные с новые данные

...