baji/app/admin/controller/Upload.php
2025-03-14 14:42:09 +00:00

287 lines
13 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\admin\controller;
// require_once '../extend/oss/autoload.php';
use app\admin\controller\Base;
use OSS\Core\OssException;
use OSS\OssClient;
use think\facade\Db;
use think\facade\Filesystem;
use think\facade\Request;
use Qcloud\Cos\Client;
class Upload extends Base
{
private $secretId; // 腾讯云 API 密钥 SecretId
private $secretKey; // 腾讯云 API 密钥 SecretKey
private $bucket; // 存储桶名称
private $region; // 存储桶所在地域
private $domain; // 存储桶所在地域
public function initialize()
{
$config = getConfig('uploads');
$this->secretId = $config['AccessKeyId'];
$this->secretKey = $config['AccessKeySecret'];
$this->bucket = $config['Bucket'];
$this->region = $config['Region'];
$this->domain = $config['Domain'];
}
/**
* 上传文件到腾讯云 COS
*/
public function picture()
{
// 获取表单上传文件
$files = request()->file('file', '');
if (empty($files)) {
return $this->renderError("请上传图片");
}
// 文件格式校验
$ext = ['jpg', 'png', 'jpeg', 'JPG', 'PNG', 'JPEG', 'gif', 'apk', 'mp3'];
$type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1);
if (!in_array($type, $ext)) {
return $this->renderError("文件格式错误");
}
// 文件大小校验
if ($_FILES['file']['size'] > 20971520) {
return $this->renderError("上传文件不能超过20M");
}
// 判断是否上传过
$hash = $files->hash('sha1');
$info = Db::name('picture')->where('token', $hash)->find();
if (false) {
$data['path'] = imageUrl($info['imgurl']);
$data['imgurl'] = $info['imgurl'];
return $this->renderSuccess('上传成功', $data);
} else {
// 初始化腾讯云 COS 客户端
$cosClient = new Client([
'region' => $this->region,
'schema' => 'https', // 协议
'credentials' => [
'secretId' => $this->secretId,
'secretKey' => $this->secretKey,
],
]);
// 生成唯一文件名
$date = date('Ymd');
$uniqueFileName = md5(uniqid(rand(), true)) . '.' . $type;
$cosKey = 'topic/' . $date . '/' . $uniqueFileName; // COS 中的文件路径
try {
// 上传文件到腾讯云 COS
$result = $cosClient->putObject([
'Bucket' => $this->bucket,
'Key' => $cosKey,
'Body' => fopen($_FILES['file']['tmp_name'], 'rb'), // 文件内容
]);
// 获取文件访问 URL
$cosUrl = $result['Location'];
$imgurl = $this->domain . $cosKey;
// 新增数据到数据库
$save_data['token'] = $hash;
$save_data['imgurl'] = $imgurl; // 保存 COS 中的文件路径
$save_data['addtime'] = time();
$save_data['type'] = 1;
$res = Db::name('picture')->insertGetId($save_data);
if ($res) {
$data['id'] = $res;
$data['path'] = $imgurl; // 返回文件的完整访问 URL
$data['imgurl'] = $imgurl ;
return $this->renderSuccess('上传成功', $data);
} else {
return $this->renderError('上传失败');
}
} catch (\Exception $e) {
return $this->renderError('文件上传失败:' . $e->getMessage());
}
}
}
/**
* 上传文件
*/
public function picture_file()
{
// 获取表单上传文件
$files = request()->file('file', '');
if (empty($files)) {
return $this->renderError("请上传图片");
}
$ext = ['jpg', 'png', 'jpeg', 'JPG', 'PNG', 'JPEG', 'gif', 'apk', 'mp3'];
$type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1);
if (!in_array($type, $ext)) {
return $this->renderError("文件格式错误");
}
if ($_FILES['file']['size'] > 20971520) {
return $this->renderError("上传文件不能超过20M");
}
// 判断是否上传过
$hash = $files->hash('sha1');
$info = Db::name('picture')->where('token', $hash)->find();
if ($info) {
// if (false) {
$data['path'] = imageUrl($info['imgurl']);
$data['imgurl'] = $info['imgurl'];
return $this->renderSuccess('上传成功', $data);
} else {
// 保存图片
$date = date('Ymd');
$uniqueFileName = md5(uniqid(rand(), true)) . '.' . $type;
$saveDir = './storage/topic/' . $date;
if (!is_dir($saveDir)) {
mkdir($saveDir, 0777, true);
}
$savename = $saveDir . '/' . $uniqueFileName;
// 移动文件到目标目录
if (move_uploaded_file($_FILES['file']['tmp_name'], $savename)) {
$savename = str_replace('\\', '/', $savename);
$savename = substr($savename, 1); // 去掉开头的 “.”
// 新增数据
$save_data['token'] = $hash;
$save_data['imgurl'] = $savename;
$save_data['addtime'] = time();
$res = Db::name('picture')->insertGetId($save_data);
if ($res) {
$data['id'] = $res;
$data['path'] = imageUrl($savename);
$data['imgurl'] = $savename;
return $this->renderSuccess('上传成功', $data);
} else {
return $this->renderError('上传失败');
}
} else {
return $this->renderError('文件保存失败');
}
}
}
public function uploadimage(){
// return
return '{"imageActionName":"uploadimage","imageFieldName":"upfile","imageMaxSize":51200000,"imageAllowFiles":[".png",".jpg",".jpeg",".gif",".bmp",".php"],"imageCompressEnable":true,"imageCompressBorder":600,"imageInsertAlign":"none","imageUrlPrefix":"","imagePathFormat":"\/ueditor\/php\/upload\/image\/{yyyy}{mm}{dd}\/{time}{rand:6}","scrawlActionName":"uploadscrawl","scrawlFieldName":"upfile","scrawlPathFormat":"\/ueditor\/php\/upload\/image\/{yyyy}{mm}{dd}\/{time}{rand:6}","scrawlMaxSize":51200000,"scrawlUrlPrefix":"","scrawlInsertAlign":"none","snapscreenActionName":"uploadimage","snapscreenPathFormat":"\/ueditor\/php\/upload\/image\/{yyyy}{mm}{dd}\/{time}{rand:6}","snapscreenUrlPrefix":"","snapscreenInsertAlign":"none","catcherLocalDomain":["127.0.0.1","localhost","img.baidu.com"],"catcherActionName":"catchimage","catcherFieldName":"source","catcherPathFormat":"\/ueditor\/php\/upload\/image\/{yyyy}{mm}{dd}\/{time}{rand:6}","catcherUrlPrefix":"","catcherMaxSize":51200000,"catcherAllowFiles":[".png",".jpg",".jpeg",".gif",".bmp"],"videoActionName":"uploadvideo","videoFieldName":"upfile","videoPathFormat":"\/ueditor\/php\/upload\/video\/{yyyy}{mm}{dd}\/{time}{rand:6}","videoUrlPrefix":"","videoMaxSize":102400000,"videoAllowFiles":[".flv",".swf",".mkv",".avi",".rm",".rmvb",".mpeg",".mpg",".ogg",".ogv",".mov",".wmv",".mp4",".webm",".mp3",".php",".wav",".mid"],"fileActionName":"uploadfile","fileFieldName":"upfile","filePathFormat":"\/ueditor\/php\/upload\/file\/{yyyy}{mm}{dd}\/{time}{rand:6}","fileUrlPrefix":"","fileMaxSize":51200000,"fileAllowFiles":[".png",".jpg",".jpeg",".gif",".bmp",".flv",".swf",".mkv",".avi",".rm",".rmvb",".mpeg",".mpg",".ogg",".ogv",".mov",".wmv",".mp4",".webm",".mp3",".wav",".mid",".rar",".zip",".tar",".gz",".7z",".bz2",".cab",".php",".iso",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".pdf",".txt",".md",".xml"],"imageManagerActionName":"listimage","imageManagerListPath":"\/ueditor\/php\/upload\/image\/","imageManagerListSize":20,"imageManagerUrlPrefix":"","imageManagerInsertAlign":"none","imageManagerAllowFiles":[".png",".jpg",".jpeg",".gif",".php",".bmp"],"fileManagerActionName":"listfile","fileManagerListPath":"\/ueditor\/php\/upload\/file\/","fileManagerUrlPrefix":"","fileManagerListSize":20,"fileManagerAllowFiles":[".png",".jpg",".jpeg",".gif",".bmp",".flv",".swf",".mkv",".avi",".rm",".rmvb",".mpeg",".php",".mpg",".ogg",".ogv",".mov",".wmv",".mp4",".webm",".mp3",".wav",".mid",".rar",".zip",".tar",".gz",".7z",".bz2",".cab",".iso",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".pdf",".txt",".md",".xml"]}';
}
/**
* 阿里云oss上传
*/
public function picture_other()
{
#获取表单上传文件
$files = request()->file('file', '');
if (empty($files)) {
return $this->renderError("请上传文件");
}
$ext = ['apk'];
$type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1);
if (!in_array($type, $ext)) {
return $this->renderError("文件格式错误");
}
if ($_FILES['file']['size'] > 104857600) {
return $this->renderError("上传文件不能超过100M");
}
$oss = Config::getConfigInfo('aliyun_oss');
$object_file = 'newimage';
// 阿里云主账号AccessKey拥有所有API的访问权限风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维请登录RAM控制台创建RAM账号。
$accessKeyId = $oss['file_accessKeyId'];
$accessKeySecret = $oss['file_accessKeySecret'];
// Endpoint以杭州为例其它Region请按实际情况填写。
$endpoint = $oss['file_endpoint'];
// 设置存储空间名称。
$bucket = $oss['file_bucket'];
// 设置文件名称。
$object = $object_file . '/' . date('Ym') . '/' . sha1(date('YmdHis', time()) . uniqid()) . '.' . $type;
// <yourLocalFile>由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。
$filePath = $_FILES['file']['tmp_name'];
try {
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
$ossClient->uploadFile($bucket, $object, $filePath);
} catch (OssException $e) {
return $this->renderError("上传失败");
}
$data['path'] = imageUrl($object);
$data['imgurl'] = $object;
return $this->renderSuccess('上传成功', $data);
}
/**
* 上传图片
*/
public function picture_old()
{
#获取表单上传文件
$files = request()->file('file', '');
if (empty($files)) {
return $this->renderError("请上传图片");
}
$ext = ['jpg', 'png', 'jpeg', 'JPG', 'PNG', 'JPEG', 'gif'];
$type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1);
if (!in_array($type, $ext)) {
return $this->renderError("文件格式错误");
}
if ($_FILES['file']['size'] > 5242880) {
return $this->renderError("上传文件不能超过5M");
}
#判断是否上传过
$hash = $files->hash('sha1');
$info = Picture::where('token', $hash)->find();
if ($info) {
$data['id'] = $info['id'];
$data['path'] = imageUrl($info['imgurl']);
$data['imgurl'] = $info['imgurl'];
return $this->renderSuccess('上传成功', $data);
} else {
#保存图片
$savename = \think\facade\Filesystem::disk('public')->putFile('topic', $files);
$hash = $files->hash('sha1');
$savename = '/storage/' . $savename;
$savename = str_replace('\\', '/', $savename);
#新增数据
$save_data['token'] = $hash;
$save_data['imgurl'] = $savename;
$save_data['addtime'] = time();
$res = (new Picture())->save($save_data);
if ($res) {
$data['id'] = $res;
$data['path'] = imageUrl($savename);
$data['imgurl'] = $savename;
return $this->renderSuccess('上传成功', $data);
} else {
return $this->renderError('上传失败');
}
}
}
/**
* 上传证书
*/
public function wechat_cert()
{
$files = request()->file('file', '');
$ext = ['cer', 'pfx'];
$type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1);
if (!in_array($type, $ext)) {
return $this->renderError("文件格式错误");
}
$savename = $_FILES['file']['name'];
\think\facade\Filesystem::disk('ssl')->putFileAs('', $files, $savename);
return $this->renderSuccess('上传成功', $savename);
}
}