如何从 minio 下载文件夹为 zip 文件?

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

我遵循的步骤是。

  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) 为空。 下载空 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();

提前致谢。

java zip inputstream minio minion
1个回答
0
投票

我在 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
值是minio里面文件夹路径的base64转换

这是代码,希望对您有所帮助:

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;
        }   
    }
© www.soinside.com 2019 - 2024. All rights reserved.