Skip to content

Commit

Permalink
Merge pull request #414 from qiniu/fix/resume-upload-fail-fast
Browse files Browse the repository at this point in the history
fix resume upload can not fail fast when init upload id failed
  • Loading branch information
bachue authored Jun 27, 2023
2 parents 6a6da4c + da3ab8a commit e69ce85
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 7 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
## 7.10.0 (2023-06-20)
* 对象存储,新增请求中间件逻辑,方便拓展请求逻辑
* 对象存储,新增备用 UC 域名用于查询区域域名
* 对象存储,修复分片上传初始化失败无法快速失败

## 7.9.0 (2023-03-31)
* 对象存储,修复无法对 key 为空字符串的对象进行操作
Expand Down
31 changes: 24 additions & 7 deletions src/Qiniu/Storage/ResumeUploader.php
Original file line number Diff line number Diff line change
Expand Up @@ -283,8 +283,10 @@ private function uploadV2($fname, $blkputRets = null)
$uploaded = 0;
$partNumber = 1;
$encodedObjectName = $this->key ? \Qiniu\base64_urlSafeEncode($this->key) : '~';

$isResumeUpload = $blkputRets !== null;

// 初始化 upload id
$err = null;
if ($blkputRets) {
if (isset($blkputRets["etags"]) && isset($blkputRets["uploadId"]) &&
isset($blkputRets["expiredAt"]) && $blkputRets["expiredAt"] > time() &&
Expand All @@ -298,12 +300,16 @@ private function uploadV2($fname, $blkputRets = null)
$uploaded = $blkputRets["uploaded"];
$partNumber = count($this->finishedEtags["etags"]) + 1;
} else {
$this->makeInitReq($encodedObjectName);
$err = $this->makeInitReq($encodedObjectName);
}
} else {
$this->makeInitReq($encodedObjectName);
$err = $this->makeInitReq($encodedObjectName);
}
if ($err != null) {
return array(null, $err);
}

// 上传分片
fseek($this->inputStream, $uploaded);
while ($uploaded < $this->size) {
$blockSize = $this->blockSize($uploaded);
Expand Down Expand Up @@ -452,9 +458,15 @@ private function blockSize($uploaded)

private function makeInitReq($encodedObjectName)
{
$res = $this->initReq($encodedObjectName);
$this->finishedEtags["uploadId"] = $res['uploadId'];
$this->finishedEtags["expiredAt"] = $res['expireAt'];
list($ret, $err) = $this->initReq($encodedObjectName);

if ($ret == null) {
return $err;
}

$this->finishedEtags["uploadId"] = $ret['uploadId'];
$this->finishedEtags["expiredAt"] = $ret['expireAt'];
return $err;
}

/**
Expand All @@ -468,7 +480,12 @@ private function initReq($encodedObjectName)
'Content-Type' => 'application/json'
);
$response = $this->postWithHeaders($url, null, $headers);
return $response->json();
$ret = $response->json();
if ($response->ok() && $ret != null) {
return array($ret, null);
}

return array(null, new Error($url, $response));
}

/**
Expand Down

0 comments on commit e69ce85

Please sign in to comment.