Как скачать папку из minio в виде zip файла?

Шаги, которые я выполнил, следующие.

  1. получить все объекты из рекурсивных объектов
      Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder()
    .bucket(bucketName).recursive(true).build());

  1. Затем получить все потоки, соответствующие префиксу
       InputStream stream = minioClient.getObject(GetObjectArgs.builder()
.bucket(bucketName).object(objectName).build());

список нескольких потоков, полученных потоком InputStream. Как преобразовать его в zip-файл?

попробовал следующий код, но он (zipOut) имеет значение null. загрузка пустого zip, как это исправить?

      ByteArrayOutputStream fos = new ByteArrayOutputStream();
ZipOutputStream zipOut = new ZipOutputStream(fos);
ZipEntry zipEntry1 = new ZipEntry(objectName);
zipEntry1.setSize(resource.contentLength());
zipEntry1.setTime(System.currentTimeMillis());
zipOut.putNextEntry(zipEntry1);
StreamUtils.copy(stream.readAllBytes(), zipOut);
zipOut.closeEntry();

Заранее спасибо.

1 ответ

У меня была такая же проблема на C#, вот как мне удалось ее решить: если вы зайдете на панель управления MinIO, вы сможете загрузить папку в виде заархивированного файла: Теперь, если вы проверите запрос браузера, это будет примерно так:

      curl '*MINIO_URL*/api/v1/buckets/*BUCKET_NAME*/objects/download?prefix=*PREFIX*'\
  -H 'Accept: */*' \
  -H 'Accept-Language: en-US,en;q=0.9,fa;q=0.8' \
  -H 'Connection: keep-alive' \
  -H 'Cookie: token=*TOKEN*' \
  -H 'Referer: MINIO_URL/browser/BUCKET_NAME' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36' \
  --compressed \
  --insecure

Где следует заменитьMINIO_URL&BUCKET_NAMEс собственными ценностями, теперьTOKENзначение — это то, что вы получаете при входе в панель управления. тотPREFIXзначение — это преобразование в base64 пути к папке внутри minio.

Это код, надеюсь, он поможет:

      public async Task<byte[]> DownloadZippedFolder(string filePath)
    {
        var httpContent = new StringContent(
            content: JsonConvert.SerializeObject(
                new 
                {
                    accessKey = _minIOSetting.DashboardUserName, 
                    secretKey = _minIOSetting.DashboardPassword
                }
            ), 
            encoding: Encoding.UTF8, 
            mediaType: "application/json"
        );
        try
        {
            var loginResponse = await _httpClient.PostAsync($"{_minIOSetting.LoginUrl}/api/v1/login", httpContent);

            string prefix = Convert.ToBase64String(Encoding.UTF8.GetBytes(filePath));

            loginResponse.Headers.TryGetValues("Set-Cookie", out var setCookie);

            _httpClient.DefaultRequestHeaders.Add("Cookie", setCookie.First());
            string url = _minIOSetting.LoginUrl
                + "/api/v1/buckets/"
                + _minIOSetting.BucketName
                + "/objects/download?prefix="
                + prefix;
            var dlreq = await _httpClient.GetAsync(url);
            var contentStream = await dlreq.Content.ReadAsStreamAsync();

            var memStream = new MemoryStream();
            await contentStream.CopyToAsync(memStream);

            var bs = memStream.ToArray();
            return bs;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"min IO error, DownloadZippedFolder: {ex.Message}");
            return null;
        }   
    }
Другие вопросы по тегам