/** * 分段上传函数 * @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; }
/** * 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); }
*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']);