开发者社区 问答 正文

PHP-SDK之如何实现上传文件(三)?


查看已上传的分片


查看上传的分片可以罗列出指定Upload ID所属的所有已经上传成功的分片。
通过下面代码,可以查看一次上传任务已上传的分片: /**
* 查看已上传的分片
*
* @param OssClient $ossClient OSSClient实例
* @param string $bucket 存储空间名称
* @param string $uploadId  upload Id
* @return null
*/
function putObject($ossClient, $bucket, $uploadId)
{
    $object = "oss-php-sdk-test/upload-test-object-name.txt";
    try{
        $listPartsInfo = $ossClient->listParts($bucket, $object, $upload_id);
        foreach ($listPartsInfo->getListPart() as $partInfo) {
            print($partInfo->getPartNumber() . "\t" . $partInfo->getSize() . "\t" . $partInfo->getETag() . "\t" . $partInfo->getLastModified() . "\n");
        }
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . ": OK" . "\n");
}



查看当前正在进行的分片上传任务


通过下面代码,可以得到当前正在进行中,还未完成的分片上传: <?php
/**
* 获取当前未完成的分片上传列表
*
* @param $ossClient OssClient
* @param $bucket   string
*/
function listMultipartUploads($ossClient, $bucket) {
    $options = array(
                'delimiter' => '/',
                'max-uploads' => 100,
                'key-marker' => '',
                'prefix' => '',
                'upload-id-marker' => ''
            );
    try {
        $listMultipartUploadInfo = $ossClient->listMultipartUploads($bucket, $options);
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": listMultipartUploads FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    printf(__FUNCTION__ . ": listMultipartUploads OK\n");
    $listUploadInfo = $listMultipartUploadInfo->getUploads();
    var_dump($listUploadInfo);
}


上述例子中提到的$options参数说明:

key说明
delimiter是一个用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组元素——CommonPrefixes。
key-marker与upload-id-marker参数一同使用来指定返回结果的起始位置。
max-uploads限定此次返回Multipart Uploads事件的最大数目,如果不设定,默认为1000,max-uploads取值不能大于1000。
prefix限定返回的object key必须以prefix作为前缀。注意使用prefix查询时,返回的key中仍会包含prefix。
upload-id-marker与key-marker参数一同使用来指定返回结果的起始位置。


设置文件元信息(Object Meta)


文件元信息(Object Meta),是对用户上传到OSS的文件的属性描述,分为两种:HTTP标准属性(HTTP Headers)和User Meta(用户自定义元信息)。 文件元信息可以在各种方式上传(字符串上传、文件上传、追加上传、分片上传),或拷贝文件时进行设置。元信息的名称大小写不敏感。更多文件元信息的介绍,请参看 文件元信息

设定Http Header


OSS允许用户自定义Http header。Http header请参考 RFC2616。几个常用的http header说明如下:
名称描述默认值
Content-MD5文件数据校验,设置了该值后OSS会启用文件内容MD5校验,把您提供的MD5与文件的MD5比较,不一致会抛出错误
Content-Type文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,如果没有扩展名则填默认值application/octet-stream
Content-Disposition指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称
Content-Length上传的文件的长度,超过流/文件的长度会截断,不足为实际值流/文件时间长度
Expires缓存过期时间,OSS未使用,格式是格林威治时间(GMT)
Cache-Control指定该Object被下载时的网页的缓存行为

下面的代码实现了上传时设置文件的Http Headers: /**
* 上传时设置文件的元数据
*
* @param OssClient $ossClient OSSClient实例
* @param string $bucket 存储空间名称
* @return null
*/
function putObject($ossClient, $bucket)
{
    $object = "oss-php-sdk-test/upload-test-object-name.txt";
    $content = file_get_contents(__FILE__);
    $options = array(
        OssClient::OSS_HEADERS => array(
            'Expires' => '2012-10-01 08:00:00',
            'Content-Disposition' => 'attachment; filename="xxxxxx"',
    ));
    try{
        $ossClient->putObject($bucket, $object, $content, $options);
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . ": OK" . "\n");
}


提示:
  • 通过设置文件的Content-Type,可以修改文件的类型;
  • 通过设置文件的Content-Disposition,可以控制文件的下载行为;
  • putObject、uploadFile、appendObject、appendFile、multiuploadFile、initiateMultipartUpload操作支持设定Http Header。


用户自定义元信息


OSS支持用户自定义Object的元信息,对Object进行描述。
下面的代码实现了上传时设置文件的自定义元数据: <?php
/**
* 上传时设置文件的自定义元数据
*
* @param OssClient $ossClient OSSClient实例
* @param string $bucket 存储空间名称
* @return null
*/
function putObject($ossClient, $bucket)
{
    $object = "oss-php-sdk-test/upload-test-object-name.txt";
    $content = file_get_contents(__FILE__);
    $options = array(OssClient::OSS_HEADERS => array(
        'x-oss-meta-self-define-title' => 'user define meta info',
    ));
    try{
        $ossClient->putObject($bucket, $object, $content, $options);
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . ": OK" . "\n");
}

提示:
  • 文件的元信息可以通过OssClient::getObjectMeta获取;
  • user meta的名称大小写不敏感,例如设置为:’x-oss-meta-name’,读取名字为x-oss-meta-name的参数即可;
  • 一个文件可以有多个元信息,总大小不能超过8KB;
  • putObject、uploadFile、appendObject、appendFile、multiuploadFile、initiateMultipartUpload操作支持设定自定义元信息。


上传时使用MD5校验


为了确保PHP SDK发送的数据和OSS服务端接收到的数据一致,OSS支持MD5校验。文件上传时(字符串上传、文件上传、追加上传、分片上传)默认关闭MD5,如果您需要打开MD5校验,请上传文件的options设置。
下面的代码实现了上传时开启MD5校验: <?php
/**
* 上传时开启MD5校验
*
* @param OssClient $ossClient OSSClient实例
* @param string $bucket 存储空间名称
* @return null
*/
function putObject($ossClient, $bucket)
{
    $object = "oss-php-sdk-test/upload-test-object-name.txt";
    $options = array(OssClient::OSS_CHECK_MD5 => true);
    try{
        $ossClient->uploadFile($bucket, $object, __FILE__, $options);
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . ": OK" . "\n");
}

提示:
  • 使用Md5校验时,性能会有所损失;
  • putObject、uploadFile、appendObject、appendFile、multiuploadFile操作支持 OSS_CHECK_MD5 选择。

展开
收起
青衫无名 2017-10-19 09:59:46 2483 分享 版权
0 条回答
写回答
取消 提交回答