使用httpwebrequest下载的C#文件和Cookie损坏 [英] c# files downloaded with httpwebrequest and cookies get corrupted

查看:77
本文介绍了使用httpwebrequest下载的C#文件和Cookie损坏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试制作一个程序,该程序能够使用httpwebrequest和cookie(具有用于保持登录状态的凭据信息)下载带有URI(URL)的文件.

我可以使用以下代码下载文件,但下载后文件损坏.

当我将xlsx文件(在网页上)下载到本地驱动器的文本文件中时,我看到损坏的文件中来自原始文件的数字和单词的某些部分,因此我认为我已经到达了正确的文件./p>

但是,当我在本地驱动器的xlsx文件中下载xlsx文件(在网页上)时,似乎无法打开

excel无法打开文件'filename.xlsx',因为文件格式为文件扩展名无效.验证文件是否尚未损坏,并且文件扩展名与文件格式匹配.

下载后有什么方法可以保留完整的原始文件内容?

我也附上了部分结果内容.

  private void btsDownload_Click(对象发送者,EventArgs e){尝试{字符串filepath1 = @"PathAndNameofFile.txt";字符串sTmpCookieString = GetGlobalCookies(webBrowser1.Url.AbsoluteUri);HttpWebRequest fstRequest =(HttpWebRequest)WebRequest.Create(sLinkDwPage);fstRequest.Method ="GET";fstRequest.CookieContainer =新的System.Net.CookieContainer();fstRequest.CookieContainer.SetCookies(webBrowser1.Document.Url,sTmpCookieString);HttpWebResponse fstResponse =(HttpWebResponse)fstRequest.GetResponse();StreamReader sr = new StreamReader(fstResponse.GetResponseStream());字符串sPageData = sr.ReadToEnd();sr.Close();字符串sViewState = ExtractInputHidden(sPageData,"__VIEWSTATE");字符串sEventValidation = this.ExtractInputHidden(sPageData,"__EVENTVALIDATION");字符串sUrl = ssItemLinkDwPage;HttpWebRequest hwrRequest =(HttpWebRequest)WebRequest.Create(sUrl);hwrRequest.Method ="POST";字符串sPostData ="__EVENTTARGET =& __ EVENTARGUMENT =& __ VIEWSTATE =" + sViewState +& __ EVENTVALIDATION =" + sEventValidation +& Name = test" +& Button1 = Button";ASCIIEncoding编码=新的ASCIIEncoding();byte [] bByteArray = encoding.GetBytes(sPostData);hwrRequest.ContentType ="application/x-www-form-urlencoded";Uri转换的URI =新的Uri(ssDwPage);hwrRequest.CookieContainer =新的System.Net.CookieContainer();hwrRequest.CookieContainer.SetCookies(convertedURI,sTmpCookieString);hwrRequest.ContentLength = bByteArray.Length;流sDataStream = hwrRequest.GetRequestStream();sDataStream.Write(bByteArray,0,bByteArray.Length);sDataStream.Close();使用(WebResponse response = hwrRequest.GetResponse()){使用(sDataStream = response.GetResponseStream()){StreamReader reader =新的StreamReader(sDataStream);{字符串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();}}}}抓住{MessageBox.Show("Error");}} 

解决方案

StreamReader 用于处理文本数据.使用它会损坏您的二进制数据(excel文件).

直接将 sDataStream 写入文件.对于前.

  sDataStream.CopyTo(fs) 

PS:我准备了一个测试用例(使用类似的逻辑)来展示您的代码如何工作

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

只需将 binaryData newData

I am trying to make a program which is able to download files with URI(URL) using httpwebrequest and cookies(for credential information to keep login status).

I can download files with following code but files get corrupted after being downloaded.

when I download xlsx file(on the web page) into text file at local drive, I see some part of numbers and words from an original file in a corrupted file, therefore I assume I have reached to the right file.

however, when I download xlsx file(on the web page) in xlsx file at local drive, it seems like it fails to open saying

excel cannot open the file 'filename.xlsx' because the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file.

Is there any way I can keep fully original file content after I download?

I attach a part of result content as well.

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");
  }
}

解决方案

StreamReader is for dealing with text data. Using it corrupts your binary data(excel file).

Write sDataStream directly to file. For ex.

sDataStream.CopyTo(fs)

PS: I prepared a test case (using similar logic) to show how your code doesn't work

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

Just compare binaryData with newData

这篇关于使用httpwebrequest下载的C#文件和Cookie损坏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆