我遵循的步骤是。
Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder()
.bucket(bucketName).recursive(true).build());
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();
提前致谢。
我在 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;
}
}