6. 文件下载

S3 PHP SDK提供了丰富的文件下载接口,用户可以通过以下方式从S3获取文件:

  • 下载文件到内存
  • 下载到本地文件
  • 分段下载
  • 条件下载

6.1. 下载文件到内存

以下源代码实现下载文件到内存中:

<?php

/**
* 获取对象
* @param $s3Client S3Client实例
* @param $bucketName 桶名
* @param $objectName 对象名
*/
function getObject($s3Client,$bucketName,$objectName){
    try{
        $result = $s3Client->getObject(['Bucket'=>$bucketName,
            'Key'=>$objectName]);
        // The 'Body' value of the result is an EntityBody object
        echo get_class($result['Body']) . "\n";
        // > Guzzle\Http\EntityBody

        // The 'Body' value can be cast to a string
        echo $result['Body'] . "\n";
        // > Hello!
    } catch (\Aws\Exception\AwsException $e){
        echo $e->getMessage();
    }
}

6.2. 下载文件到本地文件

以下源代码实现将S3文件下载到本地文件:

<?php

/**
* 获取对象
* @param $s3Client S3Client实例
* @param $bucketName 桶名
* @param $objectName 对象名
* @param $fileName   存储的文件名
*/

function getObjectToLocalFile($s3Client,$bucketName,$objectName,$fileName){
    try{
        $result = $s3Client->getObject(['Bucket'=>$bucketName,
            'Key'=>$objectName,
            'SaveAs'=>$fileName]);
    } catch (\Aws\Exception\AwsException $e){
        echo $e->getMessage();
    }
}

6.3. 范围下载

如果存储在S3中的文件较大,并且您只需要其中的一部分内容,您可以使用范围下载,下载指定范围的数据,如果指定的下载范围为”0-100”,则返回结果为第0字节到第100字节的数据,返回的数据包含第100字节,即[0,100],如果指定的范围无效则下载整个文件,以下源代码获取[0,100]字节的内容:

<?php

/**
* 获取对象
* @param $s3Client S3Client实例
* @param $bucketName 桶名
* @param $objectName 对象名
* @param $fileName   存储的文件名
*/

function getObjectOfRange($s3Client,$bucketName,$objectName,$range){
    try{
        $result = $s3Client->getObject(['Bucket'=>$bucketName,
            'Key'=>$objectName,
            'Range'=>$range]);
        echo $result['Body'] . "\n";
    } catch (\Aws\Exception\AwsException $e){
        echo $e->getMessage();
    }
}

getObjectOfRange($s3Client,$bucketName,$objectName,'bytes=0-3');

Attention

  1. 下载内容也可以存储到文件中
  2. 注意下载的区间为闭区间

6.4. 条件下载

下载文件时,可以指定限定条件,满足限定条件时下载,不满足时报错,不下载文件。可以使用的限定条件如下:

参数 说明 S3Client对应值
If-Modified-Since 如果指定的时间早于实际修改时间,则正常传送。否则返回错误 IfModifiedSince
<?php

/**
* @param $s3Client S3Client实例
* @param $bucketName 桶名
* @param $objectName 对象名
* @param $lastMod mixed type: string (date format)|int (unix timestamp)|\DateTime
*/
function getObjectByLastModifiedTime($s3Client,$bucketName,$objectName,$lastMod){
    try{
        $result = $s3Client->getObject(['Bucket'=>$bucketName,
            'Key'=>$objectName,
            'IfModifiedSince'=>$lastMod]);
        echo $result['Body'] . "\n";
    } catch (\Aws\Exception\AwsException $e){
        echo $e->getMessage();
    }
}

Attention

  1. 下载内容也可以存储到文件中