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

Kyle спросил: 12 мая 2018 в 04:38 в: c#

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

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

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

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

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

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

p> Я также присоединяю часть результирующего контента.
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 ответ

Есть решение
Eser ответил: 12 мая 2018 в 04:49

StreamReader предназначен для работы с данными text. Использование этого файла повреждает ваши двоичные данные (файл 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

Просто сравните binaryData ​​em> с newData ​​em>