/**
  * 分段上传函数
  * @param string $object 在OSS中存储的文件名称带上路径
  * @param string $upload_file 上传本地文件的名称带路径 根据给出的路径可以找到该文件
  */
 public function fenduan($object, $upload_file)
 {
     //分段上传
     $oss = $this;
     $bucket = $oss->bucket;
     //OSS空间名称
     $upload_id = $oss->init_multipart_upload($bucket, $object);
     $part_size = 5 * 1024 * 1024;
     //分块大小
     $upload_filesize = filesize($upload_file);
     $_SESSION['file_size'] = $upload_filesize;
     $pieces = $oss->get_multipart_counts($upload_filesize, $part_size);
     $response_upload_part = array();
     $upload_position = 0;
     $is_check_md5 = true;
     foreach ($pieces as $i => $piece) {
         $from_pos = $upload_position + (int) $piece[$oss::OSS_SEEK_TO];
         $to_pos = (int) $piece[$oss::OSS_LENGTH] + $from_pos - 1;
         $up_options = array($oss::OSS_FILE_UPLOAD => $upload_file, $oss::OSS_PART_NUM => $i + 1, $oss::OSS_SEEK_TO => $from_pos, $oss::OSS_LENGTH => $to_pos - $from_pos + 1, $oss::OSS_CHECK_MD5 => $is_check_md5);
         if ($is_check_md5) {
             $content_md5 = OSSUtil::get_content_md5_of_file($upload_file, $from_pos, $to_pos);
             $up_options[$oss::OSS_CONTENT_MD5] = $content_md5;
         }
         //2. 将每一分片上传到OSS
         $response_upload_part[] = $oss->upload_part($bucket, $object, $upload_id, $up_options);
     }
     $upload_parts = array();
     $upload_part_result = true;
     foreach ($response_upload_part as $i => $res) {
         $upload_part_result = $upload_part_result && $res->isOk();
         $msg = "上传分块到 /" . $bucket . "/" . $object . " upload id is: " . $upload_id;
         if (!$upload_part_result) {
             throw new OSS_Exception('部分上传没有成功!');
         }
         $upload_parts[] = array('PartNumber' => $i + 1, 'ETag' => (string) $res->header['etag']);
     }
     // var_dump($upload_parts);
     /**
      *获取Bucket内所有分块上传事件
      */
     $options = array('key-marker' => "", 'max-uploads' => 1000, 'upload-id-marker' => "");
     $res = $oss->list_multipart_uploads($bucket, $options);
     $msg = "获取Bucket内所有分块上传事件";
     OSSUtil::print_res($res, $msg);
     if ($res->isOK()) {
         SampleUtil::my_echo($res->body);
     }
     /**
      *获取所有已上传的块信息
      */
     $res = $oss->list_parts($bucket, $object, $upload_id);
     $msg = "获取所有已上传的块信息";
     OSSUtil::print_res($res, $msg);
     if ($res->isOK()) {
         SampleUtil::my_echo($res->body);
     }
     $res = $oss->complete_multipart_upload($bucket, $object, $upload_id, $upload_parts);
     return $res->status;
 }
Example #2
0
 /**
  * multipart上传统一封装,从初始化到完成multipart,以及出错后中止动作
  * @param string $bucket (Required)
  * @param string $object (Required)
  * @param array $options (Optional) Key-Value数组
  * @return ResponseCore
  * @throws OSS_Exception
  */
 public function create_mpu_object($bucket, $object, $options = null)
 {
     $this->precheck_common($bucket, $object, $options);
     if (isset($options[self::OSS_LENGTH])) {
         $options[self::OSS_CONTENT_LENGTH] = $options[self::OSS_LENGTH];
         unset($options[self::OSS_LENGTH]);
     }
     if (isset($options[self::OSS_FILE_UPLOAD])) {
         //Windows系统下进行转码
         $options[self::OSS_FILE_UPLOAD] = OSSUtil::encoding_path($options[self::OSS_FILE_UPLOAD]);
     }
     $this->precheck_param($options, self::OSS_FILE_UPLOAD, __FUNCTION__);
     $upload_position = isset($options[self::OSS_SEEK_TO]) ? (int) $options[self::OSS_SEEK_TO] : 0;
     if (isset($options[self::OSS_CONTENT_LENGTH])) {
         $upload_file_size = (int) $options[self::OSS_CONTENT_LENGTH];
     } else {
         $filename = $options[self::OSS_FILE_UPLOAD];
         $upload_file_size = filesize($filename);
         if ($upload_file_size !== false) {
             $upload_file_size -= $upload_position;
         }
     }
     if ($upload_position === false || !isset($upload_file_size) || $upload_file_size === false || $upload_file_size < 0) {
         throw new OSS_Exception('The size of `fileUpload` cannot be determined in ' . __FUNCTION__ . '().');
     }
     // 处理partSize
     if (isset($options[self::OSS_PART_SIZE])) {
         $options[self::OSS_PART_SIZE] = $this->get_part_size($options[self::OSS_PART_SIZE]);
     } else {
         $options[self::OSS_PART_SIZE] = self::OSS_MID_PART_SIZE;
     }
     $is_check_md5 = $this->is_check_md5($options);
     // 如果上传的文件小于partSize,则直接使用普通方式上传
     if ($upload_file_size < $options[self::OSS_PART_SIZE] && !isset($options[self::OSS_UPLOAD_ID])) {
         $local_file = $options[self::OSS_FILE_UPLOAD];
         $options = array(self::OSS_CHECK_MD5 => $is_check_md5);
         return $this->upload_file_by_file($bucket, $object, $local_file, $options);
     }
     // 初始化multipart
     if (isset($options[self::OSS_UPLOAD_ID])) {
         $upload_id = $options[self::OSS_UPLOAD_ID];
     } else {
         //初始化
         $init_options = array();
         $upload_id = $this->init_multipart_upload($bucket, $object, $init_options);
     }
     // 获取的分片
     $pieces = $this->get_multipart_counts($upload_file_size, (int) $options[self::OSS_PART_SIZE]);
     $response_upload_part = array();
     foreach ($pieces as $i => $piece) {
         $from_pos = $upload_position + (int) $piece[self::OSS_SEEK_TO];
         $to_pos = (int) $piece[self::OSS_LENGTH] + $from_pos - 1;
         $up_options = array(self::OSS_FILE_UPLOAD => $options[self::OSS_FILE_UPLOAD], self::OSS_PART_NUM => $i + 1, self::OSS_SEEK_TO => $from_pos, self::OSS_LENGTH => $to_pos - $from_pos + 1, self::OSS_CHECK_MD5 => $is_check_md5);
         if ($is_check_md5) {
             $content_md5 = OSSUtil::get_content_md5_of_file($options[self::OSS_FILE_UPLOAD], $from_pos, $to_pos);
             $up_options[self::OSS_CONTENT_MD5] = $content_md5;
         }
         $response_upload_part[] = $this->upload_part($bucket, $object, $upload_id, $up_options);
     }
     $upload_parts = array();
     $upload_part_result = true;
     foreach ($response_upload_part as $i => $response) {
         $upload_part_result = $upload_part_result && $response->isOk();
         if (!$upload_part_result) {
             throw new OSS_Exception('any part upload failed, please try again');
         }
         $upload_parts[] = array('PartNumber' => $i + 1, 'ETag' => (string) $response->header['etag']);
     }
     return $this->complete_multipart_upload($bucket, $object, $upload_id, $upload_parts);
 }
Example #3
0
 *Upload Part本地上传
 */
//1. 获取的分片
$part_size = 10 * 1024 * 1024;
$upload_file = __FILE__;
$upload_filesize = filesize($upload_file);
$pieces = $oss->get_multipart_counts($upload_filesize, $part_size);
$response_upload_part = array();
$upload_position = 0;
$is_check_md5 = true;
foreach ($pieces as $i => $piece) {
    $from_pos = $upload_position + (int) $piece[$oss::OSS_SEEK_TO];
    $to_pos = (int) $piece[$oss::OSS_LENGTH] + $from_pos - 1;
    $up_options = array($oss::OSS_FILE_UPLOAD => $upload_file, $oss::OSS_PART_NUM => $i + 1, $oss::OSS_SEEK_TO => $from_pos, $oss::OSS_LENGTH => $to_pos - $from_pos + 1, $oss::OSS_CHECK_MD5 => $is_check_md5);
    if ($is_check_md5) {
        $content_md5 = OSSUtil::get_content_md5_of_file($upload_file, $from_pos, $to_pos);
        $up_options[$oss::OSS_CONTENT_MD5] = $content_md5;
    }
    //2. 将每一分片上传到OSS
    $response_upload_part[] = $oss->upload_part($bucket, $object, $upload_id, $up_options);
}
$upload_parts = array();
$upload_part_result = true;
foreach ($response_upload_part as $i => $res) {
    $upload_part_result = $upload_part_result && $res->isOk();
    $msg = "上传分块到 /" . $bucket . "/" . $object . " upload id is: " . $upload_id;
    OSSUtil::print_res($res, $msg);
    if (!$upload_part_result) {
        throw new OSS_Exception('any part upload failed, please try again');
    }
    $upload_parts[] = array('PartNumber' => $i + 1, 'ETag' => (string) $res->header['etag']);