1

を試してみdownload file via WebClientましたが、ファイルからすべてのバイトが返されたわけではありません。Original file has 45Kbdownload only 8kbトータルファイルから。ユーザーエージェントヘッダーを追加した後に発生しました。

私のコードは次のとおりです。

using (ZipFile zip = new ZipFile())
{
     foreach (KeyValuePair<string, string> i in filesToInclude)
     {
         System.Net.WebClient wc = new System.Net.WebClient();
         wc.Credentials = System.Net.CredentialCache.DefaultCredentials;
         wc.UseDefaultCredentials = true;
         wc.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
         string downloadUrl = SPContext.Current.Site.Url + i.Key;    
         AppClass.WriteToLog(string.Format("downloadUrl: {0}", downloadUrl));
         byte[] img = wc.DownloadData(downloadUrl);
         zip.AddEntry(i.Value, img);
      }
      zip.Save(Response.OutputStream);
    }

何かアイデアはありますか?

更新:以前のバージョンでurlは正しくビルドされません。コードを次のように変更します。

using (ZipFile zip = new ZipFile())
{
     foreach (KeyValuePair<string, string> i in filesToInclude)
     {
          System.Net.WebClient wc = new System.Net.WebClient();
          wc.Credentials = System.Net.CredentialCache.DefaultCredentials;
          wc.UseDefaultCredentials = true;
          wc.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
          string downloadUrl = SPContext.Current.Site.Url + i.Key;
          Uri uri = new Uri(downloadUrl);
          AppClass.WriteToLog(string.Format("downloadUrl: {0}\nUri.AbsoluteUri: {1}", downloadUrl, uri.AbsoluteUri));
          byte[] img = wc.DownloadData(uri.AbsoluteUri);

          if (!wc.ResponseHeaders.Get(0).Contains("OK"))
          {
               AppClass.WriteToLog("Unable to donwload the file");
          }
          zip.AddEntry(i.Value, img);
      }

      zip.Save(Response.OutputStream);
}

そして今、私は別の問題を抱えています。The remote server returned an error: (403) Forbidden

4

1 に答える 1

1

エラーメッセージまたはそのようなものである可能性があります。ファイルからバイトを実際にダウンロードしていない可能性があります。結果を文字列として読み取って、エラー メッセージでないかどうかを確認してください。または、WebClient から HTTP 応答コードを取得してみてください。

これは悪い方法ですが、次のようなエラー チェックを行う必要があります。

> using (ZipFile zip = new ZipFile()) {
>      foreach (KeyValuePair<string, string> i in filesToInclude)
>      {
>          System.Net.WebClient wc = new System.Net.WebClient();
>          wc.Credentials = System.Net.CredentialCache.DefaultCredentials;
>          wc.UseDefaultCredentials = true;
>          wc.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
>          string downloadUrl = SPContext.Current.Site.Url + i.Key;    
>          AppClass.WriteToLog(string.Format("downloadUrl: {0}", downloadUrl));
>          byte[] img = wc.DownloadData(downloadUrl);
>          if (!wc.ResponseHeaders[0].Contains("OK"))
>          {
>            throw new Exception("Unable to donwload the file");
>          }
>          zip.AddEntry(i.Value, img);
>       }
>       zip.Save(Response.OutputStream); 
> }
于 2012-11-02T09:47:25.933 に答える