public function upload()
{
$uploaded = 0;
while ($uploaded < $this->size) {
$blockSize = $this->blockSize($uploaded);
$data = fread($this->inputStream, $blockSize);
if ($data === false) {
throw new \Exception("file read failed", 1);
}
$crc = \Qiniu\crc32_data($data);
$response = $this->makeBlock($data, $blockSize);
$ret = null;
if ($response->ok() && $response->json() != null) {
$ret = $response->json();
}
if ($response->statusCode < 0) {
list($bakHost, $err) = $this->config->zone->getBackupUpHostByToken($this->upToken);
if ($err != null) {
return array(null, $err);
}
$this->host = $bakHost;
}
if ($response->needRetry() || !isset($ret['crc32']) || $crc != $ret['crc32']) {
$response = $this->makeBlock($data, $blockSize);
$ret = $response->json();
}
if (!$response->ok() || !isset($ret['crc32']) || $crc != $ret['crc32']) {
return array(null, new Error($this->currentUrl, $response));
}
array_push($this->contexts, $ret['ctx']);
$uploaded += $blockSize;
}
return $this->makeFile();
}
/** * 上传文件到七牛 * * @param $upToken 上传凭证 * @param $key 上传文件名 * @param $filePath 上传文件的路径 * @param $params 自定义变量,规格参考 * http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar * @param $mime 上传数据的mimeType * @param $checkCrc 是否校验crc32 * * @return array[] 包含已上传文件的信息,类似: * [ * "hash" => "<Hash string>", * "key" => "<Key string>" * ] */ public function putFile($upToken, $key, $filePath, $params = null, $mime = 'application/octet-stream', $checkCrc = false) { $file = fopen($filePath, 'rb'); if ($file === false) { throw new \Exception("file can not open", 1); } $params = self::trimParams($params); $stat = fstat($file); $size = $stat['size']; if ($size <= Config::BLOCK_SIZE) { $data = fread($file, $size); fclose($file); if ($data === false) { throw new \Exception("file can not read", 1); } return FormUploader::put($upToken, $key, $data, $params, $mime, $checkCrc); } $up = new ResumeUploader($upToken, $key, $file, $size, $params, $mime, $checkCrc); return $up->upload(); }