Rumah > Artikel > pembangunan bahagian belakang > 程序员 - 我用了PHP API 上传图片提示 直接上传文件 401Unauthorized
下面是代码
<code class="lang-php"><?php require_once('../upyun.class.php'); $upyun = new UpYun('*', '*', '*'); try { echo "直接上传文件\r\n"; $fh = fopen('sample.jpeg', 'rb'); $rsp = $upyun->writeFile('12.jpeg', $fh, True); // 上传图片,自动创建目录 fclose($fh); var_dump($rsp); echo "DONE\n\r\n"; echo "设置MD5校验文件完整性\r\n"; $opts = array( UpYun::CONTENT_MD5 => md5(file_get_contents("sample.jpeg")) ); $fh = fopen('sample.jpeg', 'rb'); $rsp = $upyun->writeFile('/demo/sample_md5.jpeg', $fh, True, $opts); // 上传图片,自动创建目录 fclose($fh); var_dump($rsp); echo "DONE\r\n\r\n"; echo "直接生成缩略图,不保存原图片,仅对图片文件有效\r\n"; $opts = array( UpYun::X_GMKERL_TYPE => 'square', // 缩略图类型 UpYun::X_GMKERL_VALUE => 150, // 缩略图大小 UpYun::X_GMKERL_QUALITY => 95, // 缩略图压缩质量 UpYun::X_GMKERL_UNSHARP => True // 是否进行锐化处理 ); $fh = fopen('sample.jpeg', 'rb'); $rsp = $upyun->writeFile('/demo/sample_thumb_1.jpeg', $fh, True, $opts); // 上传图片,自动创建目录 fclose($fh); var_dump($rsp); echo "DONE\r\n\r\n"; echo "按照预先设置的缩略图类型生成缩略图类型生成缩略图,不保存原图,仅对图片空间有效\r\n"; $opts = array( UpYun::X_GMKERL_THUMBNAIL => 'thumbtype' ); $fh = fopen('sample.jpeg', 'rb'); $rsp = $upyun->writeFile('/demo/sample_thumb_2.jpeg', $fh, True, $opts); // 上传图片,自动创建目录 fclose($fh); var_dump($rsp); echo "DONE\r\n\r\n"; } catch(Exception $e) { echo $e->getCode(); echo $e->getMessage(); } </code>
<code><?php class UpYunException extends Exception {/*{{{*/ public function __construct($message, $code, Exception $previous = null) { parent::__construct($message, $code); // For PHP 5.2.x } public function __toString() { return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; } }/*}}}*/ class UpYunAuthorizationException extends UpYunException {/*{{{*/ public function __construct($message, $code = 0, Exception $previous = null) { parent::__construct($message, 401, $previous); } }/*}}}*/ class UpYunForbiddenException extends UpYunException {/*{{{*/ public function __construct($message, $code = 0, Exception $previous = null) { parent::__construct($message, 403, $previous); } }/*}}}*/ class UpYunNotFoundException extends UpYunException {/*{{{*/ public function __construct($message, $code = 0, Exception $previous = null) { parent::__construct($message, 404, $previous); } }/*}}}*/ class UpYunNotAcceptableException extends UpYunException {/*{{{*/ public function __construct($message, $code = 0, Exception $previous = null) { parent::__construct($message, 406, $previous); } }/*}}}*/ class UpYunServiceUnavailable extends UpYunException {/*{{{*/ public function __construct($message, $code = 0, Exception $previous = null) { parent::__construct($message, 503, $previous); } }/*}}}*/ class UpYun { const VERSION = '2.0'; /*{{{*/ const ED_AUTO = 'v0.api.upyun.com'; const ED_TELECOM = 'v1.api.upyun.com'; const ED_CNC = 'v2.api.upyun.com'; const ED_CTT = 'v3.api.upyun.com'; const CONTENT_TYPE = 'Content-Type'; const CONTENT_MD5 = 'Content-MD5'; const CONTENT_SECRET = 'Content-Secret'; // 缩略图 const X_GMKERL_THUMBNAIL = 'x-gmkerl-thumbnail'; const X_GMKERL_TYPE = 'x-gmkerl-type'; const X_GMKERL_VALUE = 'x-gmkerl-value'; const X_GMKERL_QUALITY = 'xgmkerl-quality'; const X_GMKERL_UNSHARP = 'xgmkerl-unsharp'; /*}}}*/ private $_bucket_name; private $_username; private $_password; private $_timeout = 30; /** * @deprecated */ private $_content_md5 = NULL; /** * @deprecated */ private $_file_secret = NULL; /** * @deprecated */ private $_file_infos= NULL; protected $endpoint; /** * 初始化 UpYun 存储接口 * @param $bucketname 空间名称 * @param $username 操作员名称 * @param $password 密码 * * @return object */ public function __construct($*, $*, $*, $endpoint = NULL, $timeout = 30) {/*{{{*/ $this->_bucketname = $*; $this->_username = $*; $this->_password = md5($*; $this->_timeout = $timeout; $this->endpoint = is_null($endpoint) ? self::ED_AUTO : $endpoint; }/*}}}*/ /** * 获取当前SDK版本号 */ public function version() { return self::VERSION; } /** * 创建目录 * @param $path 路径 * @param $auto_mkdir 是否自动创建父级目录,最多10层次 * * @return void */ public function makeDir($path, $auto_mkdir = false) {/*{{{*/ $headers = array('Folder' => 'true'); if ($auto_mkdir) $headers['Mkdir'] = 'true'; return $this->_do_request('PUT', $path, $headers); }/*}}}*/ /** * 删除目录和文件 * @param string $path 路径 * * @return boolean */ public function delete($path) {/*{{{*/ return $this->_do_request('DELETE', $path); }/*}}}*/ /** * 上传文件 * @param string $path 存储路径 * @param mixed $file 需要上传的文件,可以是文件流或者文件内容 * @param boolean $auto_mkdir 自动创建目录 * @param array $opts 可选参数 */ public function writeFile($path, $file, $auto_mkdir = False, $opts = NULL) {/*{{{*/ if (is_null($opts)) $opts = array(); if (!is_null($this->_content_md5) || !is_null($this->_file_secret)) { //if (!is_null($this->_content_md5)) array_push($opts, self::CONTENT_MD5 . ": {$this->_content_md5}"); //if (!is_null($this->_file_secret)) array_push($opts, self::CONTENT_SECRET . ": {$this->_file_secret}"); if (!is_null($this->_content_md5)) $opts[self::CONTENT_MD5] = $this->_content_md5; if (!is_null($this->_file_secret)) $opts[self::CONTENT_SECRET] = $this->_file_secret; } // 如果设置了缩略版本或者缩略图类型,则添加默认压缩质量和锐化参数 //if (isset($opts[self::X_GMKERL_THUMBNAIL]) || isset($opts[self::X_GMKERL_TYPE])) { // if (!isset($opts[self::X_GMKERL_QUALITY])) $opts[self::X_GMKERL_QUALITY] = 95; // if (!isset($opts[self::X_GMKERL_UNSHARP])) $opts[self::X_GMKERL_UNSHARP] = 'true'; //} if ($auto_mkdir === True) $opts['Mkdir'] = 'true'; $this->_file_infos = $this->_do_request('PUT', $path, $opts, $file); return $this->_file_infos; }/*}}}*/ /** * 下载文件 * @param string $path 文件路径 * @param mixed $file_handle * * @return mixed */ public function readFile($path, $file_handle = NULL) {/*{{{*/ return $this->_do_request('GET', $path, NULL, NULL, $file_handle); }/*}}}*/ /** * 获取目录文件列表 * * @param string $path 查询路径 * * @return mixed */ public function getList($path = '/') {/*{{{*/ $rsp = $this->_do_request('GET', $path); $list = array(); if ($rsp) { $rsp = explode("\n", $rsp); foreach($rsp as $item) { @list($name, $type, $size, $time) = explode("\t", trim($item)); if (!empty($time)) { $type = $type == 'N' ? 'file' : 'folder'; } $item = array( 'name' => $name, 'type' => $type, 'size' => intval($size), 'time' => intval($time), ); array_push($list, $item); } } return $list; }/*}}}*/ /** * 获取目录空间使用情况 * * @param string $path 目录路径 * * @return mixed */ public function getFolderUsage($path) {/*{{{*/ $rsp = $this->_do_request('GET', $path . '?usage'); return floatval($rsp); }/*}}}*/ /** * 获取文件、目录信息 * * @param string $path 路径 * * @return mixed */ public function getFileInfo($path) {/*{{{*/ $rsp = $this->_do_request('HEAD', $path); return $rsp; }/*}}}*/ /** * 连接签名方法 * @param $method 请求方式 {GET, POST, PUT, DELETE} * return 签名字符串 */ private function sign($method, $uri, $date, $length){/*{{{*/ //$uri = urlencode($uri); $sign = "{$method}&{$uri}&{$date}&{$length}&{$this->_password}"; return 'UpYun '.$this->_username.':'.md5($sign); }/*}}}*/ /** * HTTP REQUEST 封装 * @param string $method HTTP REQUEST方法,包括PUT、POST、GET、OPTIONS、DELETE * @param string $path 除Bucketname之外的请求路径,包括get参数 * @param array $headers 请求需要的特殊HTTP HEADERS * @param array $body 需要POST发送的数据 * * @return mixed */ protected function _do_request($method, $path, $headers = NULL, $body= NULL, $file_handle= NULL) {/*{{{*/ $uri = "/{$this->_bucketname}{$path}"; $ch = curl_init("http://{$this->endpoint}{$uri}"); $_headers = array('Expect:'); if (!is_null($headers) && is_array($headers)){ foreach($headers as $k => $v) { array_push($_headers, "{$k}: {$v}"); } } $length = 0; $date = gmdate('D, d M Y H:i:s \G\M\T'); if (!is_null($body)) { if(is_resource($body)){ fseek($body, 0, SEEK_END); $length = ftell($body); fseek($body, 0); array_push($_headers, "Content-Length: {$length}"); curl_setopt($ch, CURLOPT_INFILE, $body); curl_setopt($ch, CURLOPT_INFILESIZE, $length); } else { $length = @strlen($body); array_push($_headers, "Content-Length: {$length}"); curl_setopt($ch, CURLOPT_POSTFIELDS, $body); } } else { array_push($_headers, "Content-Length: {$length}"); } array_push($_headers, "Authorization: {$this->sign($method, $uri, $date, $length)}"); array_push($_headers, "Date: {$date}"); curl_setopt($ch, CURLOPT_HTTPHEADER, $_headers); curl_setopt($ch, CURLOPT_TIMEOUT, $this->_timeout); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); if ($method == 'PUT' || $method == 'POST') { curl_setopt($ch, CURLOPT_POST, 1); } else { curl_setopt($ch, CURLOPT_POST, 0); } if ($method == 'GET' && is_resource($file_handle)) { curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FILE, $file_handle); } if ($method == 'HEAD') { curl_setopt($ch, CURLOPT_NOBODY, true); } $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code == 0) throw new UpYunException('Connection Failed', $http_code); curl_close($ch); $header_string = ''; $body = ''; if ($method == 'GET' && is_resource($file_handle)) { $header_string = ''; $body = $response; } else { list($header_string, $body) = explode("\r\n\r\n", $response, 2); } //var_dump($http_code); if ($http_code == 200) { if ($method == 'GET' && is_null($file_handle)) { return $body; } else { $data = $this->_getHeadersData($header_string); return count($data) > 0 ? $data : true; } //elseif ($method == 'HEAD') { // //return $this->_get_headers_data(substr($response, 0 , $header_size)); // return $this->_getHeadersData($header_string); //} //return True; } else { $message = $this->_getErrorMessage($header_string); if (is_null($message) && $method == 'GET' && is_resource($file_handle)) { $message = 'File Not Found'; } switch($http_code) { case 401: throw new UpYunAuthorizationException($message); break; case 403: throw new UpYunForbiddenException($message); break; case 404: throw new UpYunNotFoundException($message); break; case 406: throw new UpYunNotAcceptableException($message); break; case 503: throw new UpYunServiceUnavailable($message); break; default: throw new UpYunException($message, $http_code); } } }/*}}}*/ /** * 处理HTTP HEADERS中返回的自定义数据 * * @param string $text header字符串 * * @return array */ private function _getHeadersData($text) {/*{{{*/ $headers = explode("\r\n", $text); $items = array(); foreach($headers as $header) { $header = trim($header); if(strpos($header, 'x-upyun') !== False){ list($k, $v) = explode(':', $header); $items[trim($k)] = in_array(substr($k,8,5), array('width','heigh','frame')) ? intval($v) : trim($v); } } return $items; }/*}}}*/ /** * 获取返回的错误信息 * * @param string $header_string * * @return mixed */ private function _getErrorMessage($header_string) { list($status, $stash) = explode("\r\n", $header_string, 2); list($v, $code, $message) = explode(" ", $status, 3); return $message; } /** * 删除目录 * @deprecated * @param $path 路径 * * @return void */ public function rmDir($path) {/*{{{*/ $this->_do_request('DELETE', $path); }/*}}}*/ /** * 删除文件 * * @deprecated * @param string $path 要删除的文件路径 * * @return boolean */ public function deleteFile($path) {/*{{{*/ $rsp = $this->_do_request('DELETE', $path); }/*}}}*/ /** * 获取目录文件列表 * @deprecated * * @param string $path 要获取列表的目录 * * @return array */ public function readDir($path) {/*{{{*/ return $this->getList($path); }/*}}}*/ /** * 获取空间使用情况 * * @deprecated 推荐直接使用 getFolderUsage('/')来获取 * @return mixed */ public function getBucketUsage() {/*{{{*/ return $this->getFolderUsage('/'); }/*}}}*/ /** * 获取文件信息 * * #deprecated * @param $file 文件路径(包含文件名) * return array('type'=> file | folder, 'size'=> file size, 'date'=> unix time) 或 null */ //public function getFileInfo($file){/*{{{*/ // $result = $this->head($file); // if(is_null($r))return null; // return array('type'=> $this->tmp_infos['x-upyun-file-type'], 'size'=> @intval($this->tmp_infos['x-upyun-file-size']), 'date'=> @intval($this->tmp_infos['x-upyun-file-date'])); //}/*}}}*/ /** * 切换 API 接口的域名 * * @deprecated * @param $domain {默然 v0.api.upyun.com 自动识别, v1.api.upyun.com 电信, v2.api.upyun.com 联通, v3.api.upyun.com 移动} * return null; */ public function setApiDomain($domain){/*{{{*/ $this->endpoint = $domain; }/*}}}*/ /** * 设置待上传文件的 Content-MD5 值(如又拍云服务端收到的文件MD5值与用户设置的不一致,将回报 406 Not Acceptable 错误) * * @deprecated * @param $str (文件 MD5 校验码) * return null; */ public function setContentMD5($str){/*{{{*/ $this->_content_md5 = $str; }/*}}}*/ /** * 设置待上传文件的 访问密钥(注意:仅支持图片空!,设置密钥后,无法根据原文件URL直接访问,需带 URL 后面加上 (缩略图间隔标志符+密钥) 进行访问) * 如缩略图间隔标志符为 ! ,密钥为 bac,上传文件路径为 /folder/test.jpg ,那么该图片的对外访问地址为: http://空间域名/folder/test.jpg!bac * * @deprecated * @param $str (文件 MD5 校验码) * return null; */ public function setFileSecret($str){/*{{{*/ $this->_file_secret = $str; }/*}}}*/ /** * @deprecated * 获取上传文件后的信息(仅图片空间有返回数据) * @param $key 信息字段名(x-upyun-width、x-upyun-height、x-upyun-frames、x-upyun-file-type) * return value or NULL */ public function getWritedFileInfo($key){/*{{{*/ if(!isset($this->_file_infos))return NULL; return $this->_file_infos[$key]; }/*}}}*/ } </code>
空间名 账户 密码都是对的 用*代替了 PHP API 就改了空间名 账户 密码 其他都没变
下面是代码
<code class="lang-php"><?php require_once('../upyun.class.php'); $upyun = new UpYun('*', '*', '*'); try { echo "直接上传文件\r\n"; $fh = fopen('sample.jpeg', 'rb'); $rsp = $upyun->writeFile('12.jpeg', $fh, True); // 上传图片,自动创建目录 fclose($fh); var_dump($rsp); echo "DONE\n\r\n"; echo "设置MD5校验文件完整性\r\n"; $opts = array( UpYun::CONTENT_MD5 => md5(file_get_contents("sample.jpeg")) ); $fh = fopen('sample.jpeg', 'rb'); $rsp = $upyun->writeFile('/demo/sample_md5.jpeg', $fh, True, $opts); // 上传图片,自动创建目录 fclose($fh); var_dump($rsp); echo "DONE\r\n\r\n"; echo "直接生成缩略图,不保存原图片,仅对图片文件有效\r\n"; $opts = array( UpYun::X_GMKERL_TYPE => 'square', // 缩略图类型 UpYun::X_GMKERL_VALUE => 150, // 缩略图大小 UpYun::X_GMKERL_QUALITY => 95, // 缩略图压缩质量 UpYun::X_GMKERL_UNSHARP => True // 是否进行锐化处理 ); $fh = fopen('sample.jpeg', 'rb'); $rsp = $upyun->writeFile('/demo/sample_thumb_1.jpeg', $fh, True, $opts); // 上传图片,自动创建目录 fclose($fh); var_dump($rsp); echo "DONE\r\n\r\n"; echo "按照预先设置的缩略图类型生成缩略图类型生成缩略图,不保存原图,仅对图片空间有效\r\n"; $opts = array( UpYun::X_GMKERL_THUMBNAIL => 'thumbtype' ); $fh = fopen('sample.jpeg', 'rb'); $rsp = $upyun->writeFile('/demo/sample_thumb_2.jpeg', $fh, True, $opts); // 上传图片,自动创建目录 fclose($fh); var_dump($rsp); echo "DONE\r\n\r\n"; } catch(Exception $e) { echo $e->getCode(); echo $e->getMessage(); } </code>
<code><?php class UpYunException extends Exception {/*{{{*/ public function __construct($message, $code, Exception $previous = null) { parent::__construct($message, $code); // For PHP 5.2.x } public function __toString() { return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; } }/*}}}*/ class UpYunAuthorizationException extends UpYunException {/*{{{*/ public function __construct($message, $code = 0, Exception $previous = null) { parent::__construct($message, 401, $previous); } }/*}}}*/ class UpYunForbiddenException extends UpYunException {/*{{{*/ public function __construct($message, $code = 0, Exception $previous = null) { parent::__construct($message, 403, $previous); } }/*}}}*/ class UpYunNotFoundException extends UpYunException {/*{{{*/ public function __construct($message, $code = 0, Exception $previous = null) { parent::__construct($message, 404, $previous); } }/*}}}*/ class UpYunNotAcceptableException extends UpYunException {/*{{{*/ public function __construct($message, $code = 0, Exception $previous = null) { parent::__construct($message, 406, $previous); } }/*}}}*/ class UpYunServiceUnavailable extends UpYunException {/*{{{*/ public function __construct($message, $code = 0, Exception $previous = null) { parent::__construct($message, 503, $previous); } }/*}}}*/ class UpYun { const VERSION = '2.0'; /*{{{*/ const ED_AUTO = 'v0.api.upyun.com'; const ED_TELECOM = 'v1.api.upyun.com'; const ED_CNC = 'v2.api.upyun.com'; const ED_CTT = 'v3.api.upyun.com'; const CONTENT_TYPE = 'Content-Type'; const CONTENT_MD5 = 'Content-MD5'; const CONTENT_SECRET = 'Content-Secret'; // 缩略图 const X_GMKERL_THUMBNAIL = 'x-gmkerl-thumbnail'; const X_GMKERL_TYPE = 'x-gmkerl-type'; const X_GMKERL_VALUE = 'x-gmkerl-value'; const X_GMKERL_QUALITY = 'xgmkerl-quality'; const X_GMKERL_UNSHARP = 'xgmkerl-unsharp'; /*}}}*/ private $_bucket_name; private $_username; private $_password; private $_timeout = 30; /** * @deprecated */ private $_content_md5 = NULL; /** * @deprecated */ private $_file_secret = NULL; /** * @deprecated */ private $_file_infos= NULL; protected $endpoint; /** * 初始化 UpYun 存储接口 * @param $bucketname 空间名称 * @param $username 操作员名称 * @param $password 密码 * * @return object */ public function __construct($*, $*, $*, $endpoint = NULL, $timeout = 30) {/*{{{*/ $this->_bucketname = $*; $this->_username = $*; $this->_password = md5($*; $this->_timeout = $timeout; $this->endpoint = is_null($endpoint) ? self::ED_AUTO : $endpoint; }/*}}}*/ /** * 获取当前SDK版本号 */ public function version() { return self::VERSION; } /** * 创建目录 * @param $path 路径 * @param $auto_mkdir 是否自动创建父级目录,最多10层次 * * @return void */ public function makeDir($path, $auto_mkdir = false) {/*{{{*/ $headers = array('Folder' => 'true'); if ($auto_mkdir) $headers['Mkdir'] = 'true'; return $this->_do_request('PUT', $path, $headers); }/*}}}*/ /** * 删除目录和文件 * @param string $path 路径 * * @return boolean */ public function delete($path) {/*{{{*/ return $this->_do_request('DELETE', $path); }/*}}}*/ /** * 上传文件 * @param string $path 存储路径 * @param mixed $file 需要上传的文件,可以是文件流或者文件内容 * @param boolean $auto_mkdir 自动创建目录 * @param array $opts 可选参数 */ public function writeFile($path, $file, $auto_mkdir = False, $opts = NULL) {/*{{{*/ if (is_null($opts)) $opts = array(); if (!is_null($this->_content_md5) || !is_null($this->_file_secret)) { //if (!is_null($this->_content_md5)) array_push($opts, self::CONTENT_MD5 . ": {$this->_content_md5}"); //if (!is_null($this->_file_secret)) array_push($opts, self::CONTENT_SECRET . ": {$this->_file_secret}"); if (!is_null($this->_content_md5)) $opts[self::CONTENT_MD5] = $this->_content_md5; if (!is_null($this->_file_secret)) $opts[self::CONTENT_SECRET] = $this->_file_secret; } // 如果设置了缩略版本或者缩略图类型,则添加默认压缩质量和锐化参数 //if (isset($opts[self::X_GMKERL_THUMBNAIL]) || isset($opts[self::X_GMKERL_TYPE])) { // if (!isset($opts[self::X_GMKERL_QUALITY])) $opts[self::X_GMKERL_QUALITY] = 95; // if (!isset($opts[self::X_GMKERL_UNSHARP])) $opts[self::X_GMKERL_UNSHARP] = 'true'; //} if ($auto_mkdir === True) $opts['Mkdir'] = 'true'; $this->_file_infos = $this->_do_request('PUT', $path, $opts, $file); return $this->_file_infos; }/*}}}*/ /** * 下载文件 * @param string $path 文件路径 * @param mixed $file_handle * * @return mixed */ public function readFile($path, $file_handle = NULL) {/*{{{*/ return $this->_do_request('GET', $path, NULL, NULL, $file_handle); }/*}}}*/ /** * 获取目录文件列表 * * @param string $path 查询路径 * * @return mixed */ public function getList($path = '/') {/*{{{*/ $rsp = $this->_do_request('GET', $path); $list = array(); if ($rsp) { $rsp = explode("\n", $rsp); foreach($rsp as $item) { @list($name, $type, $size, $time) = explode("\t", trim($item)); if (!empty($time)) { $type = $type == 'N' ? 'file' : 'folder'; } $item = array( 'name' => $name, 'type' => $type, 'size' => intval($size), 'time' => intval($time), ); array_push($list, $item); } } return $list; }/*}}}*/ /** * 获取目录空间使用情况 * * @param string $path 目录路径 * * @return mixed */ public function getFolderUsage($path) {/*{{{*/ $rsp = $this->_do_request('GET', $path . '?usage'); return floatval($rsp); }/*}}}*/ /** * 获取文件、目录信息 * * @param string $path 路径 * * @return mixed */ public function getFileInfo($path) {/*{{{*/ $rsp = $this->_do_request('HEAD', $path); return $rsp; }/*}}}*/ /** * 连接签名方法 * @param $method 请求方式 {GET, POST, PUT, DELETE} * return 签名字符串 */ private function sign($method, $uri, $date, $length){/*{{{*/ //$uri = urlencode($uri); $sign = "{$method}&{$uri}&{$date}&{$length}&{$this->_password}"; return 'UpYun '.$this->_username.':'.md5($sign); }/*}}}*/ /** * HTTP REQUEST 封装 * @param string $method HTTP REQUEST方法,包括PUT、POST、GET、OPTIONS、DELETE * @param string $path 除Bucketname之外的请求路径,包括get参数 * @param array $headers 请求需要的特殊HTTP HEADERS * @param array $body 需要POST发送的数据 * * @return mixed */ protected function _do_request($method, $path, $headers = NULL, $body= NULL, $file_handle= NULL) {/*{{{*/ $uri = "/{$this->_bucketname}{$path}"; $ch = curl_init("http://{$this->endpoint}{$uri}"); $_headers = array('Expect:'); if (!is_null($headers) && is_array($headers)){ foreach($headers as $k => $v) { array_push($_headers, "{$k}: {$v}"); } } $length = 0; $date = gmdate('D, d M Y H:i:s \G\M\T'); if (!is_null($body)) { if(is_resource($body)){ fseek($body, 0, SEEK_END); $length = ftell($body); fseek($body, 0); array_push($_headers, "Content-Length: {$length}"); curl_setopt($ch, CURLOPT_INFILE, $body); curl_setopt($ch, CURLOPT_INFILESIZE, $length); } else { $length = @strlen($body); array_push($_headers, "Content-Length: {$length}"); curl_setopt($ch, CURLOPT_POSTFIELDS, $body); } } else { array_push($_headers, "Content-Length: {$length}"); } array_push($_headers, "Authorization: {$this->sign($method, $uri, $date, $length)}"); array_push($_headers, "Date: {$date}"); curl_setopt($ch, CURLOPT_HTTPHEADER, $_headers); curl_setopt($ch, CURLOPT_TIMEOUT, $this->_timeout); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); if ($method == 'PUT' || $method == 'POST') { curl_setopt($ch, CURLOPT_POST, 1); } else { curl_setopt($ch, CURLOPT_POST, 0); } if ($method == 'GET' && is_resource($file_handle)) { curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FILE, $file_handle); } if ($method == 'HEAD') { curl_setopt($ch, CURLOPT_NOBODY, true); } $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code == 0) throw new UpYunException('Connection Failed', $http_code); curl_close($ch); $header_string = ''; $body = ''; if ($method == 'GET' && is_resource($file_handle)) { $header_string = ''; $body = $response; } else { list($header_string, $body) = explode("\r\n\r\n", $response, 2); } //var_dump($http_code); if ($http_code == 200) { if ($method == 'GET' && is_null($file_handle)) { return $body; } else { $data = $this->_getHeadersData($header_string); return count($data) > 0 ? $data : true; } //elseif ($method == 'HEAD') { // //return $this->_get_headers_data(substr($response, 0 , $header_size)); // return $this->_getHeadersData($header_string); //} //return True; } else { $message = $this->_getErrorMessage($header_string); if (is_null($message) && $method == 'GET' && is_resource($file_handle)) { $message = 'File Not Found'; } switch($http_code) { case 401: throw new UpYunAuthorizationException($message); break; case 403: throw new UpYunForbiddenException($message); break; case 404: throw new UpYunNotFoundException($message); break; case 406: throw new UpYunNotAcceptableException($message); break; case 503: throw new UpYunServiceUnavailable($message); break; default: throw new UpYunException($message, $http_code); } } }/*}}}*/ /** * 处理HTTP HEADERS中返回的自定义数据 * * @param string $text header字符串 * * @return array */ private function _getHeadersData($text) {/*{{{*/ $headers = explode("\r\n", $text); $items = array(); foreach($headers as $header) { $header = trim($header); if(strpos($header, 'x-upyun') !== False){ list($k, $v) = explode(':', $header); $items[trim($k)] = in_array(substr($k,8,5), array('width','heigh','frame')) ? intval($v) : trim($v); } } return $items; }/*}}}*/ /** * 获取返回的错误信息 * * @param string $header_string * * @return mixed */ private function _getErrorMessage($header_string) { list($status, $stash) = explode("\r\n", $header_string, 2); list($v, $code, $message) = explode(" ", $status, 3); return $message; } /** * 删除目录 * @deprecated * @param $path 路径 * * @return void */ public function rmDir($path) {/*{{{*/ $this->_do_request('DELETE', $path); }/*}}}*/ /** * 删除文件 * * @deprecated * @param string $path 要删除的文件路径 * * @return boolean */ public function deleteFile($path) {/*{{{*/ $rsp = $this->_do_request('DELETE', $path); }/*}}}*/ /** * 获取目录文件列表 * @deprecated * * @param string $path 要获取列表的目录 * * @return array */ public function readDir($path) {/*{{{*/ return $this->getList($path); }/*}}}*/ /** * 获取空间使用情况 * * @deprecated 推荐直接使用 getFolderUsage('/')来获取 * @return mixed */ public function getBucketUsage() {/*{{{*/ return $this->getFolderUsage('/'); }/*}}}*/ /** * 获取文件信息 * * #deprecated * @param $file 文件路径(包含文件名) * return array('type'=> file | folder, 'size'=> file size, 'date'=> unix time) 或 null */ //public function getFileInfo($file){/*{{{*/ // $result = $this->head($file); // if(is_null($r))return null; // return array('type'=> $this->tmp_infos['x-upyun-file-type'], 'size'=> @intval($this->tmp_infos['x-upyun-file-size']), 'date'=> @intval($this->tmp_infos['x-upyun-file-date'])); //}/*}}}*/ /** * 切换 API 接口的域名 * * @deprecated * @param $domain {默然 v0.api.upyun.com 自动识别, v1.api.upyun.com 电信, v2.api.upyun.com 联通, v3.api.upyun.com 移动} * return null; */ public function setApiDomain($domain){/*{{{*/ $this->endpoint = $domain; }/*}}}*/ /** * 设置待上传文件的 Content-MD5 值(如又拍云服务端收到的文件MD5值与用户设置的不一致,将回报 406 Not Acceptable 错误) * * @deprecated * @param $str (文件 MD5 校验码) * return null; */ public function setContentMD5($str){/*{{{*/ $this->_content_md5 = $str; }/*}}}*/ /** * 设置待上传文件的 访问密钥(注意:仅支持图片空!,设置密钥后,无法根据原文件URL直接访问,需带 URL 后面加上 (缩略图间隔标志符+密钥) 进行访问) * 如缩略图间隔标志符为 ! ,密钥为 bac,上传文件路径为 /folder/test.jpg ,那么该图片的对外访问地址为: http://空间域名/folder/test.jpg!bac * * @deprecated * @param $str (文件 MD5 校验码) * return null; */ public function setFileSecret($str){/*{{{*/ $this->_file_secret = $str; }/*}}}*/ /** * @deprecated * 获取上传文件后的信息(仅图片空间有返回数据) * @param $key 信息字段名(x-upyun-width、x-upyun-height、x-upyun-frames、x-upyun-file-type) * return value or NULL */ public function getWritedFileInfo($key){/*{{{*/ if(!isset($this->_file_infos))return NULL; return $this->_file_infos[$key]; }/*}}}*/ } </code>
空间名 账户 密码都是对的 用*代替了 PHP API 就改了空间名 账户 密码 其他都没变
$rsp = $upyun->writeFile('12.jpeg', $fh, True);
保存路径必须已斜杠 "/" 开头: $rsp = $upyun->writeFile('/12.jpeg', $fh, True);