1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84:
<?php
namespace LeanCloud\Uploader;
use LeanCloud\Client;
class QiniuUploader extends SimpleUploader {
public function getUploadUrl() {
return "https://up.qbox.me/";
}
public function crc32Data($data) {
$hex = hash("crc32b", $data);
$ints = unpack("N", pack("H*", $hex));
return sprintf("%u", $ints[1]);
}
public function upload($content, $mimeType, $key) {
$boundary = md5(microtime(true));
$body = $this->multipartEncode(array(
"name" => $key,
"mimeType" => $mimeType,
"content" => $content,
), array(
"token" => $this->getAuthToken(),
"key" => $key,
"crc32" => $this->crc32Data($content)
), $boundary);
$headers[] = "User-Agent: " . Client::getVersionString();
$headers[] = "Content-Type: multipart/form-data;" .
" boundary={$boundary}";
$headers[] = "Content-Length: " . strlen($body);
$url = $this->getUploadUrl();
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
$resp = curl_exec($ch);
$respCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$respType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
$error = curl_error($ch);
$errno = curl_errno($ch);
curl_close($ch);
if ($errno > 0) {
throw new \RuntimeException("CURL ($url) error: " .
"{$errno} {$error}",
$errno);
}
$data = json_decode($resp, true);
if (isset($data["error"])) {
$code = isset($data["code"]) ? $data["code"] : 1;
throw new \RuntimeException("Upload to Qiniu ({$url}) failed: ".
"{$code} {$data['error']}", $code);
}
return $data;
}
}