ThinkPHP文件上传APP和PC端

在实际工作中我们会经常遇到各种文件上传,下面代码是用ThinkPHP写的。
[php]
/**
* 表单上传图片
* 需要生成缩略图: isThumb=1
* 需要加水印:isWatermark=1
* pc版缩略图: width height
* 手机版原图:mWidth mHeight
* 缩略图:mTWidth mTHeight
* 判断图片来源:fromType 0:商家/用户 1:平台管理员
* 图片文件夹名: dir
*/
function WSTUploadPic()
{
$imgpath = ROOT_PATH . "/public";
$fileKey = key($_FILES);
$dir = Input(‘dir’);
$fromType = input(‘fromType’);
if ($dir == ”)
return json_encode([‘msg’ => ‘没有指定文件目录!’, ‘status’ => -1]);

// 上传文件
$file = request()->file($fileKey);
if ($file === null) {
return json_encode([‘msg’ => ‘上传文件不存在或超过服务器限制’, ‘status’ => -1]);
}

$validate = new \think\Validate([
[‘fileMime’, ‘fileMime:image/png,image/gif,image/jpeg,image/x-ms-bmp’, ‘只允许上传jpg,gif,png,bmp类型的文件’],
[‘fileExt’, ‘fileExt:jpg,jpeg,gif,png,bmp’, ‘只允许上传后缀为jpg,gif,png,bmp的文件’],
[‘fileSize’, ‘fileSize:2097152’, ‘文件大小超出限制’], //最大2M
]);
$data = [‘fileMime’ => $file,
‘fileSize’ => $file,
‘fileExt’ => $file
];
if (!$validate->check($data)) {
return json_encode([‘msg’ => $validate->getError(), ‘status’ => -1]);
}

$info = $file->rule(‘uniqid’)->move(ROOT_PATH . ‘public/upload/’ . $dir . "/" . date(‘Y-m’));
if ($info) {
$filePath = $info->getPathname();
$filePath = str_replace(ROOT_PATH . ‘public/’, ”, $filePath);
$filePath = str_replace(‘\\’, ‘/’, $filePath);
$name = $info->getFilename();
$filePath = str_replace($name, ”, $filePath);
//原图路径
$imageSrc = trim($filePath . $name, ‘/’);

//图片记录
$this->WSTRecordImages($imageSrc, (int)$fromType);
//打开原图
$image = \think\Image::open($imageSrc);
//缩略图路径 手机版原图路径 手机版缩略图路径
$thumbSrc = $mSrc = $mThumb = null;
//手机版原图宽高
$mWidth = min($image->width(), (int)input(‘mWidth’, 700));
$mHeight = min($image->height(), (int)input(‘mHeight’, 700));
//手机版缩略图宽高
$mTWidth = min($image->width(), (int)input(‘mTWidth’, 250));
$mTHeight = min($image->height(), (int)input(‘mTHeight’, 250));

/* * **************************** 生成缩略图 ******************************** */
$isThumb = (int)input(‘isThumb’);
if ($isThumb == 1) {
//缩略图路径
$thumbSrc = str_replace(‘.’, ‘_thumb.’, $imageSrc);
$image->thumb((int)input(‘width’, min(300, $image->width())), (int)input(‘height’, min(300, $image->height())), 2)->save($thumbSrc, $image->type(), 90);
//是否需要生成移动版的缩略图
$suffix = WSTConf("CONF.wstMobileImgSuffix");
if (!empty($suffix)) {
$image = \think\Image::open($imageSrc);
$mSrc = str_replace(‘.’, "$suffix.", $imageSrc);
$mThumb = str_replace(‘.’, ‘_thumb.’, $mSrc);
$image->thumb($mWidth, $mHeight)->save($mSrc, $image->type(), 90);
$image->thumb($mTWidth, $mTHeight, 2)->save($mThumb, $image->type(), 90);
}
}
/* * *************************** 添加水印 ********************************** */
$isWatermark = (int)input(‘isWatermark’);
if ($isWatermark == 1 && (int)WSTConf(‘CONF.watermarkPosition’) !== 0) {
//取出水印配置
$wmWord = WSTConf(‘CONF.watermarkWord’); //文字
$wmFile = trim(WSTConf(‘CONF.watermarkFile’), ‘/’); //水印文件
$wmPosition = (int)WSTConf(‘CONF.watermarkPosition’); //水印位置
$wmSize = ((int)WSTConf(‘CONF.watermarkSize’) != 0) ? WSTConf(‘CONF.watermarkSize’) : ’20’; //大小
$wmColor = (WSTConf(‘CONF.watermarkColor’) != ”) ? WSTConf(‘CONF.watermarkColor’) : ‘#000000’; //颜色必须是16进制的
$wmOpacity = ((int)WSTConf(‘CONF.watermarkOpacity’) != 0) ? WSTConf(‘CONF.watermarkOpacity’) : ‘100’; //水印透明度
//是否有自定义字体文件
$customTtf = $_SERVER[‘DOCUMENT_ROOT’] . WSTConf(‘CONF.watermarkTtf’);
$ttf = is_file($customTtf) ? $customTtf : EXTEND_PATH . ‘/verify/verify/ttfs/3.ttf’;
$image = \think\Image::open($imageSrc);
if (!empty($wmWord)) {//当设置了文字水印 就一定会执行文字水印,不管是否设置了文件水印
//执行文字水印
$image->text($wmWord, $ttf, $wmSize, $wmColor, $wmPosition)->save($imageSrc);
if ($thumbSrc !== null) {
$image->thumb((int)input(‘width’, min(300, $image->width())), (int)input(‘height’, min(300, $image->height())), 2)->save($thumbSrc, $image->type(), 90);
}
//如果有生成手机版原图
if (!empty($mSrc)) {
$image = \think\Image::open($imageSrc);
$image->thumb($mWidth, $mHeight)->save($mSrc, $image->type(), 90);
$image->thumb($mTWidth, $mTHeight, 2)->save($mThumb, $image->type(), 90);
}
} elseif (!empty($wmFile)) {//设置了文件水印,并且没有设置文字水印
//执行图片水印
$image->water($wmFile, $wmPosition, $wmOpacity)->save($imageSrc);
if ($thumbSrc !== null) {
$image->thumb((int)input(‘width’, min(300, $image->width())), (int)input(‘height’, min(300, $image->height())), 2)->save($thumbSrc, $image->type(), 90);
}
//如果有生成手机版原图
if ($mSrc !== null) {
$image = \think\Image::open($imageSrc);
$image->thumb($mWidth, $mHeight)->save($mSrc, $image->type(), 90);
$image->thumb($mTWidth, $mTHeight, 2)->save($mThumb, $image->type(), 90);
}
}
}
//判断是否有生成缩略图
$thumbSrc = ($thumbSrc == null) ? $info->getFilename() : str_replace(‘.’, ‘_thumb.’, $info->getFilename());
$filePath = ltrim($filePath, ‘/’);
// 用户头像上传宽高限制
$isCut = (int)input(‘isCut’);
if ($isCut) {
$imgSrc = $filePath . $info->getFilename();
$image = \think\Image::open($imgSrc);
$size = $image->size(); //原图宽高
$w = $size[0];
$h = $size[1];
$rate = $w / $h;
if ($w > $h && $w > 500) {
$newH = 500 / $rate;
$image->thumb(500, $newH)->save($imgSrc, $image->type(), 90);
} elseif ($h > $w && $h > 500) {
$newW = 500 * $rate;
$image->thumb($newW, 500)->save($imgSrc, $image->type(), 90);
}
}
$savePath=$filePath.$info->getFilename();
return WSTReturn("上传成功", 1,$savePath);

} else {
//上传失败获取错误信息
return $file->getError();
}
}
/**
* 图片管理
* @param $imgPath 图片路径
* @param $fromType 0:用户/商家 1:平台管理员
*
*/
function WSTRecordImages($imgPath, $fromType)
{
$data = [];
$data[‘imgPath’] = $imgPath;
if (file_exists($imgPath)) {
$data[‘imgSize’] = filesize($imgPath); //返回字节数 imgsize/1024 k imgsize/1024/1024 m
}
//获取表名
$table = explode(‘/’, $imgPath);
$data[‘fromTable’] = $table[1];
$data[‘fromType’] = (int)$fromType;
//根据类型判断所有者
$data[‘ownId’] = ((int)$fromType == 0) ? (int)session(‘WST_USER.userId’) : (int)session(‘WST_STAFF.staffId’);
$data[‘isUse’] = 0; //默认不使用
$data[‘createTime’] = date(‘Y-m-d H:i:s’);
$data[‘dataFlag’] = 1;
//保存记录
Db::name(‘images’)->insert($data);
}
/**
* APP上传图片
* @return type
*/
public function upLoadHead()
{
Log::logger("", "进来了" . date(‘Y-m-d H:i:s’), "upLoadHead");
Log::logger("", "文件信息:" . json_encode($_FILES["file"], JSON_UNESCAPED_UNICODE), "upLoadHead");
$dir = input(‘post.dir’);
/**
* $_FILES 文件上传变量,是一个二维数组,第一维保存上传的文件的数组,第二维保存文件的属性,包括类型、大小等
* 要实现上传文件,必须修改权限为加入可写 chmod -R 777 目标目录
*/
// type/暂时不用
// if (($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/png") || ($_FILES[‘file’][‘type’] == "jpg")) {
// && ($_FILES["file"]["size"] < 20000)) // 小于20k
if ($_FILES["file"]["error"] > 0) {
switch ($_FILES[‘file’][‘error’]) {
case 1:
// 文件大小超出了服务器的空间大小
$_FILES[‘file’][‘errorInfo’] = "The file is too large (server).";
break;
case 2:
// 要上传的文件大小超出浏览器限制
$_FILES[‘file’][‘errorInfo’] = "The file is too large (form).";
break;
case 3:
// 文件仅部分被上传
$_FILES[‘file’][‘errorInfo’] = "The file was only partially uploaded.";
break;
case 4:
// 没有找到要上传的文件
$_FILES[‘file’][‘errorInfo’] = "No file was uploaded.";
break;
case 5:
// 服务器临时文件夹丢失
$_FILES[‘file’][‘errorInfo’] = "The servers temporary folder is missing.";
break;
case 6:
// 文件写入到临时文件夹出错
$_FILES[‘file’][‘errorInfo’] = "Failed to write to the temporary folder.";
break;
}
Log::logger("", json_encode($_FILES[‘file’]), "upLoadHead");
return WSTReturn($_FILES[‘file’][‘errorInfo’]);
} else {
//定义上传路径
if (!file_exists("./upload/" . $dir)) {
mkdir("./upload/" . $dir, 0777, true); //修改权限
}
$path1 = ‘./’;
$path2 = ‘upload/’ . $dir .’/’. date(‘Y-m-d’) . rand(1000, 9999); //存储路径
$postfix = ‘.jpg’; //后缀
$path = $path1 . $path2 . $postfix; //上传路径
//得到文件后缀==暂时不用
// $fillname = $_FILES[‘file’][‘name’]; // 得到文件全名
// $dotArray = explode(‘.’, $fillname); // 以.分割字符串,得到数组
// $postfix2 = end($dotArray); // 得到最后一个元素:文件后缀

$isUpload = move_uploaded_file($_FILES["file"]["tmp_name"], $path); //上传
//图片记录
$this->WSTRecordImages($path2.$postfix, 0);
$date=[‘savePath’ => $path2.$postfix];
return WSTReturn("查询成功",1,$date);

// if ($isUpload) {
//获取头部uid
// $userID = $_SERVER[‘HTTP_UID’]; //获取头部
// $map = array("userId" => $userID);
// $data["userPhoto"] = $path2 . $postfix;
// $result = db("users")->where($map)->update($data); //保存路径
// Log::logger("", "上传成功" . date(‘Y-m-d H:i:s’) . "–路径:" . $path2 . $postfix, "upLoadHead");
// return WSTReturn("上传成功", 1, $path2 . $postfix);
// } else {
// Log::logger("", "上传失败" . date(‘Y-m-d H:i:s’) . "–路径:" . $path2 . $postfix, "upLoadHead");
// return WSTReturn("上传失败", 0, $path2 . $postfix);
// }
// }
// } else {
// Log::logger("", "出现异常", "upLoadHead");
// }
}

}
[/php]

您可能还喜欢...

1 条回复

  1. xuan说道:

    我只想默默的拜读您的博客!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注