开发者社区 问答 正文

PHP-SDK 之如何实现下载文件?

OSS PHP SDK提供了丰富的文件下载接口,用户可以通过以下方式从OSS下载文件(object):

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

提示:
  • 文件下载的完整代码请参见:GitHub


下载文件到本地文件


以下代码可以下载OSS文件到本地文件: <?php
/**
* get_object_to_local_file
*
* 获取object
* 将object下载到指定的文件
*
* @param OssClient $ossClient OSSClient实例
* @param string $bucket 存储空间名称
* @return null
*/
function getObjectToLocalFile($ossClient, $bucket)
{
    $object = "oss-php-sdk-test/download-test-object-name.txt";
    $localfile = "download-test-object-name.txt";
    $options = array(
        OssClient::OSS_FILE_DOWNLOAD => $localfile,
    );
    try{
        $ossClient->getObject($bucket, $object, $options);
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . ": OK, please check localfile: 'upload-test-object-name.txt'" . "\n");
}



下载文件到内存


以下代码可以下载文件到内存: <?php
/**
* 获取object的内容
*
* @param OssClient $ossClient OSSClient实例
* @param string $bucket 存储空间名称
* @return null
*/
function getObject($ossClient, $bucket)
{
    $object = "oss-php-sdk-test/upload-test-object-name.txt";
    try{
        $content = $ossClient->getObject($bucket, $object);
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . ": OK" . "\n");
}



范围下载


如果OSS文件较大,您只需要其中一部分数据,可以使用范围下载,下载指定范围的数据。如果指定的下载范围是0 - 100,则返回第0到第100个字节的数据,包括第100个,共101字节的数据,即[0, 100]。如果指定的范围无效,则下载整个文件。
以下代码可以下载文件[0, 100]的内容到内存: <?php
/**
* 获取object的内容
*
* @param OssClient $ossClient OSSClient实例
* @param string $bucket 存储空间名称
* @return null
*/
function getObject($ossClient, $bucket)
{
    $object = "oss-php-sdk-test/upload-test-object-name.txt";
    try{
        $options = array(OssClient::OSS_RANGE => '0-100');
        $content = $ossClient->getObject($bucket, $object, $options);
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . ": OK" . "\n");
}

提示:
  • 范围下载的内容也可以下载的文件;
  • 下载范围为闭区间[start, end], 包括两端的字节。


条件下载


下载文件时,可以指定一个或多个限定条件,满足限定条件时下载,不满足时报错,不下载文件。可以使用的限定条件如下:
参数说明PHP SDK对应值
If-Modified-Since如果指定的时间早于实际修改时间,则正常传送。否则返回错误。OssClient::OSS_IF_MODIFIED_SINCE
If-Unmodified-Since如果传入参数中的时间等于或者晚于文件实际修改时间,则正常传输文件;否则返回错误。OssClient::OSS_IF_UNMODIFIED_SINCE
If-Match如果传入期望的ETag和object的ETag匹配,则正常传输;否则返回错误。OssClient::OSS_IF_MATCH
If-None-Match如果传入的ETag值和Object的ETag不匹配,则正常传输;否则返回错误。OssClient::OSS_IF_NONE_MATCH

注意:
  • 如果If-Modified-Since设定的时间不符合规范,直接返回文件,并返回200 OK;
  • If-Modified-Since和If-Unmodified-Since可以同时存在,If-Match和If-None-Match也可以同时存在;
  • 如果包含If-Unmodified-Since并且不符合或者包含If-Match并且不符合,返回412 precondition failed;
  • 如果包含If-Modified-Since并且不符合或者包含If-None-Match并且不符合,返回304 Not Modified。<?php
  • /**
  • * 如果文件在指定的时间之后修改过,则下载文件
  • *
  • * @param OssClient $ossClient OSSClient实例
  • * @param string $bucket 存储空间名称
  • * @return null
  • */
  • function getObject($ossClient, $bucket)
  • {
  •     $object = "oss-php-sdk-test/upload-test-object-name.txt";
  •     try{
  •         $options = array(
  •             OssClient::OSS_HEADERS => array(
  •                 OssClient::OSS_IF_MODIFIED_SINCE => "Fri, 13 Nov 2015 14:47:53 GMT"),
  •     );
  •         $content = $ossClient->getObject($bucket, $object, $options);
  •     } catch(OssException $e) {
  •         printf(__FUNCTION__ . ": FAILED\n");
  •         printf($e->getMessage() . "\n");
  •         return;
  •     }
  •     print(__FUNCTION__ . ": OK" . "\n");
  • }


提示:
  • 文件的ETag值可以通过OssClient::getObjectMeta获取;
  • 条件下载的内容也可以下载的文件。

展开
收起
青衫无名 2017-10-19 10:00:44 2704 分享 版权
0 条回答
写回答
取消 提交回答