You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
6.9 KiB
217 lines
6.9 KiB
<?php
|
|
|
|
|
|
namespace backend\modules\file\logic\file;
|
|
|
|
use backend\modules\file\models\ars\File;
|
|
use backend\modules\file\models\ars\TemFile;
|
|
use Exception;
|
|
use yii\web\HttpException;
|
|
use yii;
|
|
use yii\web\ServerErrorHttpException;
|
|
use backend\modules\goods\logic\goods\GoodsManager;
|
|
|
|
class FileManager
|
|
{
|
|
//数据表ats_file和ats_tem_file的类型字段type
|
|
const TYPE_NONE = 0;//不存在
|
|
const TYPE_IMAGE = 1;//图片
|
|
const TYPE_VIDEO = 2;//影视
|
|
const TYPE_EXCEL = 3;//excel表单
|
|
const TYPE_WORD = 4;//word文本
|
|
const TYPE_TXT = 5;//txt文本
|
|
|
|
public static $extension = [
|
|
self::TYPE_IMAGE => ['jpg', 'png', 'jpeg'],
|
|
self::TYPE_VIDEO => ['mp4'],
|
|
self::TYPE_EXCEL => [],
|
|
self::TYPE_WORD => ['docx'],
|
|
self::TYPE_TXT => ['txt'],
|
|
];
|
|
|
|
/**
|
|
* @param $keyword
|
|
* @return int|string
|
|
* 根据文件拓展名在$extension中查找对应的文件类型,若不存在则返回self::TYPE_NONE
|
|
*/
|
|
public static function searchType($keyword)
|
|
{
|
|
foreach(self::$extension as $key => $type){
|
|
if (in_array($keyword, $type)) {
|
|
return $key;
|
|
}
|
|
}
|
|
return self::TYPE_NONE;
|
|
}
|
|
|
|
/**
|
|
* @param $temFileIdArr
|
|
* @param $ownId
|
|
* @param $ownType
|
|
* @return array|bool
|
|
* @throws HttpException
|
|
* @throws ServerErrorHttpException
|
|
* 根据临时文件id将临时文件保存在文件中
|
|
*/
|
|
public function saveTemFileToFile($temFileIdArr, $ownId, $ownType)
|
|
{
|
|
if(empty($temFileIdArr) || !$ownId) {
|
|
return false;
|
|
}
|
|
|
|
$tra = Yii::$app->db->beginTransaction();
|
|
try {
|
|
$firstFileId = 0;
|
|
foreach ($temFileIdArr as $key => $value) {
|
|
$temFile = TemFile::findOne($value);
|
|
|
|
if ($temFile) {
|
|
$res = self::saveNewFile($temFile, $ownId, $ownType);
|
|
if ($key == 0) {
|
|
$firstFileId = $res['file_id'];
|
|
}
|
|
}
|
|
}
|
|
|
|
$tra->commit();
|
|
return ['status' => true, 'info' => '保存成功', 'first_file_id' => $firstFileId];
|
|
} catch (yii\db\Exception $e) {
|
|
$tra->rollBack();
|
|
throw new ServerErrorHttpException($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param TemFile|$temFile
|
|
* @param $ownId
|
|
* @param $ownType
|
|
* @return array
|
|
* @throws HttpException
|
|
* 创建新的文件
|
|
*/
|
|
private function saveNewFile($temFile, $ownId, $ownType)
|
|
{
|
|
$newFile = new File();
|
|
$newFile->name = $temFile->name;
|
|
$newFile->type = $temFile->type;
|
|
$newFile->own_id = $ownId;
|
|
$newFile->own_type = $ownType;
|
|
$newFile->alias = $temFile->alias;
|
|
$newFile->path = $temFile->path;
|
|
if($newFile->save()) {
|
|
return ['status' => true, 'info' => '操作成功', 'file_id' => $newFile->id];
|
|
} else {
|
|
throw new HttpException('500', 'File保存失败');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $fileIdArr
|
|
* @return bool
|
|
* @throws HttpException
|
|
* 删除file表中的文件
|
|
*/
|
|
public function deleteFile($fileIdArr)
|
|
{
|
|
if($fileIdArr){
|
|
foreach ($fileIdArr as $key => $value) {
|
|
$fileModel = File::findOne($value);
|
|
if($fileModel){
|
|
$fileModel->is_delete = File::IS_DELETE_YES;
|
|
if(!$fileModel->save()){
|
|
throw new HttpException('500', '文件删除失败');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @param yii\base\Model|$dataModel //数据模型
|
|
* @param $fileIdStrName //表单中临时保存的文件id字符串组合(以,隔开)
|
|
* @param string $fileNameInModel //需要保存到数据库中的数据表字段名称
|
|
* @param $fileOldIdStr //数据库中已经保存的文件id字符串组合(以,隔开)
|
|
* @param $fileType //File模型中定义的own_type常量
|
|
* @return bool
|
|
* @throws Exception
|
|
* 数据模型保存文件操作
|
|
*/
|
|
public static function saveFileInModel($dataModel, $fileIdStrName, $fileOldIdStr, $fileType, $fileNameInModel = '')
|
|
{
|
|
if (is_array($dataModel)) {
|
|
throw new ServerErrorHttpException('数据模型不得为数组');
|
|
}
|
|
$dataModel->save();
|
|
$saveFileRes = GoodsManager::saveFile(explode(',', $dataModel->$fileIdStrName), $dataModel, explode(',', $fileOldIdStr), $fileType);
|
|
if ($fileNameInModel && $saveFileRes['status'] && $saveFileRes['first_file_id'] !== 0) {
|
|
$dataModel->$fileNameInModel = $saveFileRes['first_file_id'];
|
|
if (!$dataModel->save()) {
|
|
throw new ServerErrorHttpException('dataModel保存失败');
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @param $fileName
|
|
* @param $formData
|
|
* @return int
|
|
* 保存临时文件操作
|
|
*/
|
|
public static function saveTemFile($fileName, $formData)
|
|
{
|
|
$temFileModel = new TemFile();
|
|
$temFileModel->user_id = Yii::$app->user->identity->id;
|
|
$temFileModel->name = $fileName;
|
|
$temFileModel->type = FileManager::searchType(pathinfo($formData['path'])['extension']);
|
|
$temFileModel->alias = $formData['alias'];
|
|
$temFileModel->path = $formData['path'];
|
|
$temFileModel->save();
|
|
return $temFileModel->id;
|
|
}
|
|
|
|
/**
|
|
* @param $data //ajax接收的数据
|
|
* @return string
|
|
* 上传插件点击删除按钮时处理文件id字符串(以,分隔)
|
|
*/
|
|
public static function dealFileIdStrInDel($data)
|
|
{
|
|
$imgIdArr = explode(',', $data['imgid']);
|
|
if(isset($data['data']['alias'])) {
|
|
$temFile = TemFile::findOne(['alias' => $data['data']['alias']]);
|
|
if ($temFile) {
|
|
$imgIdArr = array_diff($imgIdArr, [$temFile->id]);
|
|
}
|
|
}else{
|
|
foreach ($data as $key => $value) {
|
|
$temFile = File::findOne(['alias' => $value]);
|
|
if ($temFile) {
|
|
$imgIdArr = array_diff($imgIdArr, [$temFile->id]);
|
|
}
|
|
}
|
|
}
|
|
return implode(',', $imgIdArr);
|
|
}
|
|
|
|
/**
|
|
* @param $fileIdStr
|
|
* @return false|string
|
|
* 加载已有的文件数据
|
|
*/
|
|
public static function loadExitFile($fileIdStr)
|
|
{
|
|
$fileIdArr = explode(',', $fileIdStr);
|
|
$files = File::find()->where(['id' => $fileIdArr])->all();
|
|
$fileInfo = array();
|
|
if($files) {
|
|
foreach ($files as $key => $file) {
|
|
$fileInfo[$key]['name'] = $file->alias;
|
|
$fileInfo[$key]['path'] = Yii::$app->request->hostInfo . '/' . $file->path;
|
|
$fileInfo[$key]['size'] = filesize($file->path);
|
|
}
|
|
}
|
|
return json_encode($fileInfo);
|
|
}
|
|
}
|