从Amazon S3下载部件的大文件

时间:2017-10-03 16:08:28

标签: java amazon-s3 inputstream

我想从Amazon S3下载大文件到RAM。文件大于RAM大小。似乎,我需要按部件加载它。每个部分都将在端点返回。 此外,我不能使用硬盘驱动器,以存储下载的文件。 我有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;

但该代码包含问题:每个新请求都将从begin开始下载文件,因此上次下载请求(例如20 MB)将下载所有文件(例如1 GB)。因此,方法skip(long)无法正常工作。

如何按部件从inputStream下载文件?有什么建议吗?

1 个答案:

答案 0 :(得分:1)

标准S3库可以传输所需文件的任何部分:

(摘自AWS docs

<?php 
error_reporting(E_ALL);

    // Generate Random Number
    $random_number =  rand(1,9).rand(1,9).rand(1,9);
    $_SESSION['captcha_text'] = $random_number;

    // Insert random number into image
    $captcha_image = imagecreatefromjpeg("captcha.jpg");
    $font_color = imagecolorallocate($captcha_image, 0, 0, 0);
    imagestring($captcha_image, 5, 20, 5, $random_number, $font_color);
    imagejpeg($captcha_image);
    imagedestroy($captcha_image);

?>

例如,在程序中,您可以通过移动范围一次读取1000个字节。