getConfig(); if ($config['uploadmode'] === 'client') { $upload = [ 'cdnurl' => $config['cdnurl'], 'uploadurl' => 'http://' . $config['bucket'] . '.' . $config['endpoint'], 'bucket' => $config['bucket'], 'maxsize' => $config['maxsize'], 'mimetype' => $config['mimetype'], 'multipart' => [], 'multiple' => $config['multiple'] ? true : false, 'storage' => 'alioss', 'chunking' => (bool)($config['chunking']??false) ]; } else { $upload = array_merge($upload, [ 'maxsize' => $config['maxsize'], 'mimetype' => $config['mimetype'], 'multiple' => $config['multiple'] ? true : false, ]); } } /** * 上传成功后 */ public function uploadAfter(Attachment $attachment) { $config = $this->getConfig(); if ($config['uploadmode']/* === 'server'*/) { $file = ROOT_PATH . 'public' . str_replace('/', DIRECTORY_SEPARATOR, parse_url($attachment->url,PHP_URL_PATH)); $name = basename($file); $md5 = md5_file($file); $auth = new \addons\alioss\library\Auth(); $params = $auth->params($name, $md5, false); $multipart = [ [ 'name' => 'key', 'contents' => $params['key'], ], [ 'name' => 'success_action_status', 'contents' => 200, ], [ 'name' => 'OSSAccessKeyId', 'contents' => $params['id'], ], [ 'name' => 'policy', 'contents' => $params['policy'], ], [ 'name' => 'Signature', 'contents' => $params['signature'], ], [ 'name' => 'file', 'contents' => fopen($file, 'r'), ], ]; try { $uploadurl = 'http://' . $config['bucket'] . '.' . $config['endpoint']; $client = new \GuzzleHttp\Client(); // $res = $client->request('POST', $uploadurl, [ // 'multipart' => $multipart, // 'headers' => ['Accept-Encoding' => 'gzip'], // ]); $multipartStream = new \GuzzleHttp\Psr7\MultipartStream($multipart); $boundary = $multipartStream->getBoundary(); $body = (string) $multipartStream; //默认的request方法会添加Content-Length字段,但Alioss不识别,所以需要移除 $body = preg_replace('/Content\-Length:\s(\d+)[\r\n]+Content\-Type/i', "Content-Type", $body); $params = [ 'headers' => [ 'Connection' => 'close', 'Content-Type' => 'multipart/form-data; boundary=' . $boundary, ], 'body' => $body, ]; $res = $client->request('POST', $uploadurl, $params); $code = $res->getStatusCode(); //成功不做任何操作 if($config['uploadmode']=='client'){ if($attachment->id) { $attachment->delete(); } unlink($file); } } catch (\GuzzleHttp\Exception\ClientException $e) { echo json_encode(['code' => 0, 'msg' => '无法上传到远程服务器,错误:' . $e->getMessage()]); exit; } } } }