3

ブラウザのアドレスバーに配置urlすると、zipファイルがHDにダウンロードされます。zipファイルのサイズは、プロパティに記述されているように386バイトです。

メソッドを使用UnZipFilesしてファイルを抽出すると、機能します。しかし、プログラムでダウンロードしてメモリに抽出したいと思います。メソッドを使用GetResultFromServerしてzip形式のコンテンツを取得します。ヘッダーに示されているように、コンテンツのサイズはHDに保存されたzipファイルのサイズと同じです。

content-disposition: attachment; filename=emaillog-xml.zip
Content-Length: 386
Cache-Control: private
Content-Type: application/zip
Date: Mon, 10 Sep 2012 08:28:28 GMT
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET

私の質問は、によって返されたコンテンツを抽出する方法GetResultFromServerです。私は次のことを試しました:

var ms = new MemoryStream(Encoding.Unicode.GetBytes(res))
var s = new ZipInputStream(ms);

しかし、私は得Unable to read from this streamます。

更新しました

試しvar zipStream = new System.IO.Compression.GZipStream(response.GetResponseStream(), CompressionMode.Decompress)ましたがThe magic number in GZip header is not correctエラーが発生します

コード

private string GetResultFromServer(ElasticLogParams elasticLogParams)
{        
    var webRequest = (HttpWebRequest)WebRequest.Create(url);            
    var response = webRequest.GetResponse();

    using (var reader = new StreamReader(response.GetResponseStream()))
    {
        var res = reader.ReadToEnd();
        var headers = response.Headers.ToString();              

        return res;
    }
}

public static void UnZipFiles(string zippedFilePath, Stream stream = null)
{
    var s = new ZipInputStream(stream ?? File.OpenRead(zippedFilePath));

    ZipEntry theEntry;
    while ((theEntry = s.GetNextEntry()) != null)
    {
        using (var streamWriter = File.Create(@"D:\extractedXML.xml"))
        {
            var size = 2048;
            var data = new byte[size];
            while (true)
            {
                size = s.Read(data, 0, size);
                if (size > 0)
                {
                    streamWriter.Write(data, 0, size);
                }
                else
                {
                    break;
                }
            }
            streamWriter.Close();
        }
    }
    s.Close();
}
4

2 に答える 2

3

これを試してみてください:

var response = webRequest.GetResponse() as HttpWebResponse;
var stream = response.GetResponseStream();
var s = new ZipInputStream(stream);

あなたは非常に親密であり、正しいアプローチを使用していると思います-この記事を使用してそれをバックアップできます-彼らのコードは非常に似ています。

于 2012-09-10T11:45:30.947 に答える
0

私はhttp://dotnetzip.codeplex.com/ を使用しています。ダウンロードには使用していませんが、サーバーにアップロードするものを抽出するために使用しています。逆の場合も完全に機能するはずです。

マイクロソフトの組み込みzipも試しましたが、問題もありました。それで私はそれをあきらめて切り替えました。

于 2012-09-10T11:42:17.933 に答える