...
|
...
|
@@ -41,81 +41,71 @@ class Common extends Api |
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 上传文件
|
|
|
* @ApiMethod (POST)
|
|
|
* @param File $file 文件流
|
|
|
* 上传接口
|
|
|
*/
|
|
|
public function upload()
|
|
|
{
|
|
|
$config = get_addon_config('qiniu');
|
|
|
|
|
|
$file = $this->request->file('file');
|
|
|
if (empty($file)) {
|
|
|
$this->error(__('No file upload or server upload limit exceeded'));
|
|
|
if (!$file || !$file->isValid()) {
|
|
|
$this->error("请上传有效的文件");
|
|
|
}
|
|
|
$fileInfo = $file->getInfo();
|
|
|
|
|
|
//判断是否已经存在附件
|
|
|
$sha1 = $file->hash();
|
|
|
|
|
|
$upload = Config::get('upload');
|
|
|
$filePath = $file->getRealPath() ?: $file->getPathname();
|
|
|
|
|
|
preg_match('/(\d+)(\w+)/', $upload['maxsize'], $matches);
|
|
|
preg_match('/(\d+)(\w+)/', $config['maxsize'], $matches);
|
|
|
$type = strtolower($matches[2]);
|
|
|
$typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3];
|
|
|
$size = (int)$upload['maxsize'] * pow(1024, isset($typeDict[$type]) ? $typeDict[$type] : 0);
|
|
|
$fileInfo = $file->getInfo();
|
|
|
$size = (int)$config['maxsize'] * pow(1024, isset($typeDict[$type]) ? $typeDict[$type] : 0);
|
|
|
|
|
|
$suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION));
|
|
|
$suffix = $suffix && preg_match("/^[a-zA-Z0-9]+$/", $suffix) ? $suffix : 'file';
|
|
|
$suffix = $suffix ? $suffix : 'file';
|
|
|
|
|
|
$mimetypeArr = explode(',', strtolower($upload['mimetype']));
|
|
|
$md5 = md5_file($filePath);
|
|
|
$search = ['$(year)', '$(mon)', '$(day)', '$(etag)', '$(ext)'];
|
|
|
$replace = [date("Y"), date("m"), date("d"), $md5, '.' . $suffix];
|
|
|
$object = ltrim(str_replace($search, $replace, $config['savekey']), '/');
|
|
|
|
|
|
$mimetypeArr = explode(',', strtolower($config['mimetype']));
|
|
|
$typeArr = explode('/', $fileInfo['type']);
|
|
|
|
|
|
//禁止上传PHP和HTML文件
|
|
|
if (in_array($fileInfo['type'], ['text/x-php', 'text/html']) || in_array($suffix, ['php', 'html', 'htm'])) {
|
|
|
$this->error(__('Uploaded file format is limited'));
|
|
|
//检查文件大小
|
|
|
if (!$file->checkSize($size)) {
|
|
|
$this->error("起过最大可上传文件限制");
|
|
|
}
|
|
|
|
|
|
//验证文件后缀
|
|
|
if ($upload['mimetype'] !== '*' &&
|
|
|
if ($config['mimetype'] !== '*' &&
|
|
|
(
|
|
|
!in_array($suffix, $mimetypeArr)
|
|
|
|| (stripos($typeArr[0] . '/', $upload['mimetype']) !== false && (!in_array($fileInfo['type'], $mimetypeArr) && !in_array($typeArr[0] . '/*', $mimetypeArr)))
|
|
|
|| (stripos($typeArr[0] . '/', $config['mimetype']) !== false && (!in_array($fileInfo['type'], $mimetypeArr) && !in_array($typeArr[0] . '/*', $mimetypeArr)))
|
|
|
)
|
|
|
) {
|
|
|
$this->error(__('Uploaded file format is limited'));
|
|
|
}
|
|
|
//验证是否为图片文件
|
|
|
$imagewidth = $imageheight = 0;
|
|
|
if (in_array($fileInfo['type'], ['image/gif', 'image/jpg', 'image/jpeg', 'image/bmp', 'image/png', 'image/webp']) || in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'webp'])) {
|
|
|
$imgInfo = getimagesize($fileInfo['tmp_name']);
|
|
|
if (!$imgInfo || !isset($imgInfo[0]) || !isset($imgInfo[1])) {
|
|
|
$this->error(__('Uploaded file is not a valid image'));
|
|
|
}
|
|
|
$imagewidth = isset($imgInfo[0]) ? $imgInfo[0] : $imagewidth;
|
|
|
$imageheight = isset($imgInfo[1]) ? $imgInfo[1] : $imageheight;
|
|
|
$this->error(__('上传格式限制'));
|
|
|
}
|
|
|
$replaceArr = [
|
|
|
'{year}' => date("Y"),
|
|
|
'{mon}' => date("m"),
|
|
|
'{day}' => date("d"),
|
|
|
'{hour}' => date("H"),
|
|
|
'{min}' => date("i"),
|
|
|
'{sec}' => date("s"),
|
|
|
'{random}' => Random::alnum(16),
|
|
|
'{random32}' => Random::alnum(32),
|
|
|
'{filename}' => $suffix ? substr($fileInfo['name'], 0, strripos($fileInfo['name'], '.')) : $fileInfo['name'],
|
|
|
'{suffix}' => $suffix,
|
|
|
'{.suffix}' => $suffix ? '.' . $suffix : '',
|
|
|
'{filemd5}' => md5_file($fileInfo['tmp_name']),
|
|
|
];
|
|
|
$savekey = $upload['savekey'];
|
|
|
$savekey = str_replace(array_keys($replaceArr), array_values($replaceArr), $savekey);
|
|
|
|
|
|
$savekey = '/' . $object;
|
|
|
|
|
|
$uploadDir = substr($savekey, 0, strripos($savekey, '/') + 1);
|
|
|
$fileName = substr($savekey, strripos($savekey, '/') + 1);
|
|
|
//
|
|
|
$splInfo = $file->validate(['size' => $size])->move(ROOT_PATH . '/public' . $uploadDir, $fileName);
|
|
|
//先上传到本地
|
|
|
$splInfo = $file->move(ROOT_PATH . '/public' . $uploadDir, $fileName);
|
|
|
if ($splInfo) {
|
|
|
$extparam = $this->request->post();
|
|
|
$filePath = $splInfo->getRealPath() ?: $splInfo->getPathname();
|
|
|
|
|
|
$sha1 = sha1_file($filePath);
|
|
|
$imagewidth = $imageheight = 0;
|
|
|
if (in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf'])) {
|
|
|
$imgInfo = getimagesize($splInfo->getPathname());
|
|
|
$imagewidth = isset($imgInfo[0]) ? $imgInfo[0] : $imagewidth;
|
|
|
$imageheight = isset($imgInfo[1]) ? $imgInfo[1] : $imageheight;
|
|
|
}
|
|
|
$params = array(
|
|
|
'admin_id' => 0,
|
|
|
'user_id' => (int)$this->auth->id,
|
|
|
'admin_id' => session('admin.id'),
|
|
|
'user_id' => $this->auth->id,
|
|
|
'filesize' => $fileInfo['size'],
|
|
|
'imagewidth' => $imagewidth,
|
|
|
'imageheight' => $imageheight,
|
...
|
...
|
@@ -126,18 +116,48 @@ class Common extends Api |
|
|
'uploadtime' => time(),
|
|
|
'storage' => 'local',
|
|
|
'sha1' => $sha1,
|
|
|
'extparam' => json_encode($extparam),
|
|
|
);
|
|
|
$attachment = model("attachment");
|
|
|
$attachment->data(array_filter($params));
|
|
|
$attachment = Attachment::create(array_filter($params), true);
|
|
|
$policy = array(
|
|
|
'saveKey' => ltrim($savekey, '/'),
|
|
|
);
|
|
|
$auth = new \addons\qiniu\library\Auth($config['app_key'], $config['secret_key']);
|
|
|
$token = $auth->uploadToken($config['bucket'], null, $config['expire'], $policy);
|
|
|
$multipart = [
|
|
|
['name' => 'token', 'contents' => $token],
|
|
|
[
|
|
|
'name' => 'file',
|
|
|
'contents' => fopen($filePath, 'r'),
|
|
|
'filename' => $fileName,
|
|
|
]
|
|
|
];
|
|
|
try {
|
|
|
$client = new \GuzzleHttp\Client();
|
|
|
$res = $client->request('POST', $config['uploadurl'], [
|
|
|
'multipart' => $multipart
|
|
|
]);
|
|
|
$code = $res->getStatusCode();
|
|
|
//成功不做任何操作
|
|
|
} catch (\GuzzleHttp\Exception\ClientException $e) {
|
|
|
$attachment->delete();
|
|
|
unlink($filePath);
|
|
|
$this->error("上传失败");
|
|
|
}
|
|
|
|
|
|
$url = '/' . $object;
|
|
|
|
|
|
//上传成功后将存储变更为qiniu
|
|
|
$attachment->storage = 'qiniu';
|
|
|
$attachment->save();
|
|
|
\think\Hook::listen("upload_after", $attachment);
|
|
|
$this->success(__('Upload successful'), [
|
|
|
'url' => $uploadDir . $splInfo->getSaveName(),
|
|
|
'full_url' => cdnurl($uploadDir . $splInfo->getSaveName(),true)
|
|
|
|
|
|
$this->success("上传成功", [
|
|
|
'url' => $url,
|
|
|
'full_url' => cdnurl($url,true)
|
|
|
]);
|
|
|
} else {
|
|
|
// 上传失败获取错误信息
|
|
|
$this->error($file->getError());
|
|
|
$this->error('上传失败');
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
} |
...
|
...
|
|