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
- 下载内容也可以存储到文件中
- 注意下载的区间为闭区间
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
- 下载内容也可以存储到文件中