• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

程序员 – 我用了PHP API 上传图片提示 直接上传文件 401Unauthorized

php 搞代码 4年前 (2022-01-25) 22次浏览 已收录 0个评论

下面是代码

<code class="lang-php"><?phprequire_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><?phpclass 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   = 'x­gmkerl-quality';    const X_GMKERL_UNSHARP   = 'x­gmkerl-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<i>·本2文来源gaodai$ma#com搞$代*码网2</i><strong>搞gaodaima代码</strong>->_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>

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:程序员 – 我用了PHP API 上传图片提示 直接上传文件 401Unauthorized
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址