从 Amazon S3 按部分下载大文件
Download big file by parts from Amazon S3
我想从 Amazon S3 下载大文件到 RAM 中。文件大于 RAM 大小。看来,我需要按部分加载它。每个部分在端点中都是 return。
我也不能使用硬盘,将下载的文件存储在那里。
我有 InputStream
对象,我正在尝试加载如下对象:
inputStream.skip(totalBytes);
long downloadedBytesCount = 0;
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
do {
length = inputStream.read(buffer);
result.write(buffer, 0, length);
downloadedBytesCount += length;
}
while (downloadedBytesCount <= partOfFileSize && (length != -1));
totalBytes += downloadedBytesCount;
但该代码存在问题:每个新请求都会从头开始下载文件,因此最后一次下载请求(例如 20 MB)将下载所有文件(例如 1 GB)。所以,方法 skip(long)
没有像我预期的那样工作。
如何从 inputStream
中按部分下载文件?有什么建议吗?
标准 S3 库可以传输您想要的文件的任何部分:
(取自AWS docs)
GetObjectRequest rangeObjectRequest = new GetObjectRequest(
bucketName, key);
rangeObjectRequest.setRange(0, 10); // retrieve 1st 11 bytes.
S3Object objectPortion = s3Client.getObject(rangeObjectRequest);
InputStream objectData = objectPortion.getObjectContent();
例如,在您的程序中,您可以通过移动范围一次读取 1000 个字节。
我想从 Amazon S3 下载大文件到 RAM 中。文件大于 RAM 大小。看来,我需要按部分加载它。每个部分在端点中都是 return。
我也不能使用硬盘,将下载的文件存储在那里。
我有 InputStream
对象,我正在尝试加载如下对象:
inputStream.skip(totalBytes);
long downloadedBytesCount = 0;
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
do {
length = inputStream.read(buffer);
result.write(buffer, 0, length);
downloadedBytesCount += length;
}
while (downloadedBytesCount <= partOfFileSize && (length != -1));
totalBytes += downloadedBytesCount;
但该代码存在问题:每个新请求都会从头开始下载文件,因此最后一次下载请求(例如 20 MB)将下载所有文件(例如 1 GB)。所以,方法 skip(long)
没有像我预期的那样工作。
如何从 inputStream
中按部分下载文件?有什么建议吗?
标准 S3 库可以传输您想要的文件的任何部分:
(取自AWS docs)
GetObjectRequest rangeObjectRequest = new GetObjectRequest(
bucketName, key);
rangeObjectRequest.setRange(0, 10); // retrieve 1st 11 bytes.
S3Object objectPortion = s3Client.getObject(rangeObjectRequest);
InputStream objectData = objectPortion.getObjectContent();
例如,在您的程序中,您可以通过移动范围一次读取 1000 个字节。