Файлы C#, загруженные с помощью httpwebrequest, и файлы cookie повреждены

Я пытаюсь создать программу, которая может загружать файлы с 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");
  }
}

1 ответ

Решение

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

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

Другие вопросы по тегам