103 lines
3.6 KiB
PHP
103 lines
3.6 KiB
PHP
<?php
|
||
|
||
namespace app\common\library;
|
||
|
||
use app\common\exception\UploadException;
|
||
use app\common\model\Attachment;
|
||
use app\common\service\OssService;
|
||
use fast\Random;
|
||
use think\File;
|
||
use think\Hook;
|
||
|
||
/**
|
||
* OSS 文件上传
|
||
* 本地只落地到 runtime/temp(PHP 运行用户可写,不依赖 public/uploads 的写权限),
|
||
* 上传到 OSS 后删除临时文件,附件记录保存 OSS 路径
|
||
*/
|
||
class OssUpload extends Upload
|
||
{
|
||
/**
|
||
* 上传到 OSS(普通上传与分片合并共用)
|
||
* @param string|null $savekey 未使用,OSS 路径固定为 uploads/{Ymd}/{随机串}/{原文件名}
|
||
* @return \app\common\model\attachment|\think\Model
|
||
* @throws UploadException
|
||
*/
|
||
public function upload($savekey = null)
|
||
{
|
||
if (empty($this->file)) {
|
||
throw new UploadException(__('No file upload or server upload limit exceeded'));
|
||
}
|
||
|
||
$this->checkSize();
|
||
$this->checkExecutable();
|
||
$this->checkMimetype();
|
||
$this->checkImage();
|
||
|
||
$tempDir = RUNTIME_PATH . 'temp' . DS;
|
||
if (!is_dir($tempDir) && !@mkdir($tempDir, 0775, true) && !is_dir($tempDir)) {
|
||
throw new UploadException('上传临时目录创建失败或无写权限:' . $tempDir);
|
||
}
|
||
$tempName = Random::alnum(16) . '.' . $this->fileInfo['suffix'];
|
||
$tempFile = $tempDir . $tempName;
|
||
|
||
$sha1 = $this->file->hash();
|
||
|
||
if ($this->merging) {
|
||
if (!$this->file->check()) {
|
||
throw new UploadException($this->file->getError());
|
||
}
|
||
$sourceFile = $this->file->getRealPath() ?: $this->file->getPathname();
|
||
$info = $this->file->getInfo();
|
||
$this->file = null;
|
||
if (!@rename($sourceFile, $tempFile)) {
|
||
throw new UploadException('分片文件合并失败');
|
||
}
|
||
$file = new File($tempFile);
|
||
$file->setSaveName($tempName)->setUploadInfo($info);
|
||
} else {
|
||
$file = $this->file->move($tempDir, $tempName);
|
||
if (!$file) {
|
||
throw new UploadException($this->file->getError());
|
||
}
|
||
}
|
||
$this->file = $file;
|
||
|
||
$filename = mb_substr(htmlspecialchars(strip_tags($this->fileInfo['name'])), 0, 100);
|
||
$object = 'uploads/' . date('Ymd/') . Random::alnum(16) . '/' . $filename;
|
||
try {
|
||
OssService::instance()->uploadFile($tempFile, $object);
|
||
} catch (\Exception $e) {
|
||
throw new UploadException($e->getMessage());
|
||
} finally {
|
||
@unlink($tempFile);
|
||
}
|
||
|
||
$category = request()->post('category');
|
||
$category = array_key_exists($category, config('site.attachmentcategory') ?? []) ? $category : '';
|
||
$auth = Auth::instance();
|
||
$params = [
|
||
'admin_id' => (int)session('admin.id'),
|
||
'user_id' => (int)$auth->id,
|
||
'filename' => $filename,
|
||
'category' => $category,
|
||
'filesize' => $this->fileInfo['size'],
|
||
'imagewidth' => $this->fileInfo['imagewidth'],
|
||
'imageheight' => $this->fileInfo['imageheight'],
|
||
'imagetype' => $this->fileInfo['suffix'],
|
||
'imageframes' => 0,
|
||
'mimetype' => $this->fileInfo['type'],
|
||
'url' => '/' . $object,
|
||
'uploadtime' => time(),
|
||
'storage' => 'oss',
|
||
'sha1' => $sha1,
|
||
'extparam' => '',
|
||
];
|
||
$attachment = new Attachment();
|
||
$attachment->data(array_filter($params));
|
||
$attachment->save();
|
||
|
||
Hook::listen('upload_after', $attachment);
|
||
return $attachment;
|
||
}
|
||
}
|