将 zip 文件的字节数组转换回 zip 文件

问题描述 投票:0回答:2

我正在使用以下代码下载存储在 GitLab 中的 zip 文件:

   using (HttpClientHandler handler = new HttpClientHandler())
    {
        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;

        using (HttpClient client = new HttpClient(handler))
        {
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://my.gitlab.space/api/v4/projects/100/packages/generic/mypackage/1.0.0.0/myZipFile.zip");

            request.Headers.Add("PRIVATE-TOKEN", "myTokenHere");

            HttpResponseMessage response = await client.SendAsync(request);
            response.EnsureSuccessStatusCode();
            string responseBody = await response.Content.ReadAsStringAsync();

            byte[] data = Encoding.UTF8.GetBytes(responseBody);
            File.WriteAllBytes(@"D:\myZipFile.zip", data);
        }
   }

这应该等同于以下 curl 命令:

curl --header “私人令牌:myTokenHere” “https://my.gitlab.space/api/v4/projects/100/packages/generic/mypackage/1.0.0.0/myZipFile.zip” --output myZipFile.zip

以上代码和 curl 命令工作正常,除了我无法将字节数组数据转换为本地磁盘中的 zip 文件。默认情况下,字节数组已经是一个 zip 文件。

我做错了什么。

c# gitlab zip .net-4.5
2个回答
3
投票

ReadAsByteArrayAsync
代替
ReadAsStringAsync
。您想直接读取文件字节的内容。

byte[] data = await response.Content.ReadAsByteArrayAsync();

3
投票

您的主要问题是您正在以字符串形式读取数据。您可以将其作为字节读取,但将响应流直接复制到文件中效率更高。

其他问题:

  • 不要每次都创建一个新的处理程序,这会导致套接字耗尽。而是使用
    static HttpClient
  • 不要使用
    ServicePointManager
    ,因为它会在整个应用程序中设置设置。改用客户端。
  • 不要手动设置
    SecurityProtocol
    。依靠操作系统选择最佳协议。
  • 各种物品需要处理
static HttpClient _client = new
{
    DefaultRequestHeaders = {
        ExpectContinue = true,
    },
};
using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://my.gitlab.space/api/v4/projects/100/packages/generic/mypackage/1.0.0.0/myZipFile.zip");

request.Headers.Add("PRIVATE-TOKEN", "myTokenHere");

using HttpResponseMessage response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
using var file = File.OpenWrite(@"D:\myZipFile.zip");
using var stream = await response.Content.ReadAsStreamAsync();
await stream.CopyToAsync(file);
© www.soinside.com 2019 - 2024. All rights reserved.