首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用httpwebrequest和cookies下载的c#文件被损坏

使用httpwebrequest和cookies下载的c#文件被损坏
EN

Stack Overflow用户
提问于 2018-06-06 02:18:36
回答 1查看 626关注 0票数 1

我试图使一个程序,能够下载文件与URI(网址)使用httpwebrequest和cookies(凭证信息,以保持登录状态)。

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

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

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

excel无法打开文件'filename.xlsx‘,因为该文件格式或文件扩展名无效。验证文件是否已损坏,以及文件扩展名是否与文件的格式匹配。

有没有办法可以在下载后保留完整的原始文件内容?

我也附加了一部分结果内容。

代码语言:javascript
复制
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");
  }
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-06 02:22:12

StreamReader用于处理text数据。使用它会损坏你的二进制数据(excel文件)。

将sDataStream直接写入文件。对于ex。

代码语言:javascript
复制
sDataStream.CopyTo(fs)

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

代码语言:javascript
复制
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和newData就知道了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50706561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档