Swoft 图片上传与处理
上传
在Swoft下通过
\Swoft\Http\Message\Server\Request -> getUploadedFiles()['image']
方法可以获取到一个 Swoft\Http\Message\Upload\UploadedFile 对象或者对象数组(取决于上传时字段是image还是image[])
打印改对象输出:
object(Swoft\Http\Message\Upload\UploadedFile)#1813 (6) {
["clientFilename":"Swoft\Http\Message\Upload\UploadedFile":private]=>
string(25) "蒙太奇配置接口.txt"
["clientMediaType":"Swoft\Http\Message\Upload\UploadedFile":private]=>
string(10) "text/plain"
["error":"Swoft\Http\Message\Upload\UploadedFile":private]=>
int(0)
["tmpFile":"Swoft\Http\Message\Upload\UploadedFile":private]=>
string(55) "/var/www/swoft/runtime/uploadfiles/swoole.upfile.xZyq0d"
["moved":"Swoft\Http\Message\Upload\UploadedFile":private]=>
bool(false)
["size":"Swoft\Http\Message\Upload\UploadedFile":private]=>
int(710)
}
都是私用属性,无法访问,但是可以通过对应方法访问到
getClientFilename() //得到文件原名称
getClientMediaType() //得到文件类型
getSize() //获取到文件大小
通过方法
moveTo() //将文件从临时位置转移到目录
上面方法返回为NULL,在移动文件到指定位置时最好判断一下文件夹是否存在,不存在创建
图片处理
借助 ImageMagick 工具完成
ubuntu下一键安装
I. 安装ImageMagick
sudo apt-get install imagemagick II. 安装imagemagick 的lib 供php调用
sudo apt-get install libmagick++-dev III. 调用当前的pecl安装imagick
pecl install imagick IV. 修改php.ini.重启nginx服务器
在php.ini中添加: extension = imagick.so
在安装完成后修改完 /etc/php/7.0/cli/php.ini 后发现 phpinfo 页面打印出来没有出现下面信息,于是又修改了/etc/php/7.0/fpm/php.ini 才出现下面信息
安装 Intervention Image
composer require intervention/image
安装完成后可以直接在页面use
use Intervention\Image\ImageManager; $manager = new ImageManager(array('driver' => 'imagick'));
//宽缩小到300px,高自适应
$thumb = $manager->make($path)->resize(300, null, function ($constraint) {
$constraint->aspectRatio();
});
$thumb->save($path);
完整代码
namespace App\Controllers\Api; use Intervention\Image\ImageManager;
use Swoft\Http\Message\Server\Request;
use Swoft\Http\Message\Upload\UploadedFile;
use Swoft\Http\Server\Exception\NotAcceptableException;
use Swoft\Http\Server\Bean\Annotation\Controller;
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod; class FileController
{
//图片可接受的mime类型
private static $img_mime = ['image/jpeg','image/jpg','image/png','image/gif']; /**
* 文件上传
* @RequestMapping(route="image",method=RequestMethod::POST)
*/
public static function imgUpload(Request $request){
$files = $request->getUploadedFiles()['image'];
if(!$files){
throw new NotAcceptableException('image字段为空');
} if(is_array($files)){
$result = array();
foreach ($files as $file){
self::checkImgFile($file);
$result[] = self::saveImg($file);
}
}else{
self::checkImgFile($files);
return self::saveImg($files);
} } /**
* 保存图片
* @param UploadedFile $file
*/
protected static function saveImg(UploadedFile $file){
$dir = alias('@upload') . '/' . date('Ymd');
if(!is_dir($dir)){
@mkdir($dir,0777,true);
}
$ext_name = substr($file->getClientFilename(), strrpos($file->getClientFilename(),'.'));
$file_name = time().rand(1,999999);
$path = $dir . '/' . $file_name . $ext_name;
$file->moveTo($path);
//修改移动后文件访问权限,文件默认没有访问权限
@chmod($path,0775);
//生成缩略图
$manager = new ImageManager(array('driver' => 'imagick'));
$thumb = $manager->make($path)->resize(300, null, function ($constraint) {
$constraint->aspectRatio();
});
$thumb_path = $dir. '/' . $file_name . '_thumb' .$ext_name;
$thumb->save($dir. '/' . $file_name . '_thumb' .$ext_name);
@chmod($thumb_path,0775);
return [
'url' => explode(alias('@public'),$path)[1],
'thumb_url' => explode(alias('@public'),$thumb_path)[1]
];
} /**
* 图片文件校验
* @param UploadedFile $file
* @return bool
*/
protected static function checkImgFile(UploadedFile $file){
if($file->getSize() > 1024*1000*2){
throw new NotAcceptableException($file->getClientFilename().'文件大小超过2M');
}
if(!in_array($file->getClientMediaType(), self::$img_mime)){
throw new NotAcceptableException($file->getClientFilename().'类型不符');
}
return true;
} }
使用
FileController::imgUpload($request);
说明
当前保存文件路径为 alias("@upload"),需要在 /config/define.php 手动填上该路径
$aliases = [
'@root' => BASE_PATH,
'@env' => '@root',
'@app' => '@root/app',
'@res' => '@root/resources',
'@runtime' => '@root/runtime',
'@configs' => '@root/config',
'@resources' => '@root/resources',
'@beans' => '@configs/beans',
'@properties' => '@configs/properties',
'@console' => '@beans/console.php',
'@commands' => '@app/command',
'@vendor' => '@root/vendor',
'@public' => '@root/public', //public目录,也是nginx设置站点根目录
'@upload' => '@public/upload' //上传目录
];
Swoft 不提供静态资源访问,可以使用nginx托管
配置nginx
vim /etc/nginx/sites-avaiable/default
server {
listen default_server;
listen [::]: default_server; # 域名设置
server_name eko.xiao.com;
#设置nginx根目录
root /var/www/html/swoft/public; # 将所有非静态请求转发给 Swoft 处理
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection "keep-alive";
proxy_pass http://127.0.0.1:9501;
} location ~ \.php$ {
proxy_pass http://127.0.0.1:9501;
}
# 静态资源使用nginx托管
location ~* \.(js|map|css|png|jpg|jpeg|gif|ico|ttf|woff2|woff)$ {
expires max;
}
}
Swoft 图片上传与处理的更多相关文章
- Asp.Net Mvc 使用WebUploader 多图片上传
来博客园有一个月了,哈哈.在这里学到了很多东西.今天也来试着分享一下学到的东西.希望能和大家做朋友共同进步. 最近由于项目需要上传多张图片,对于我这只菜鸟来说,以前上传图片都是直接拖得控件啊,而且还是 ...
- 06.LoT.UI 前后台通用框架分解系列之——浮夸的图片上传
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- JS图片上传预览插件制作(兼容到IE6)
其实,图片预览功能非常地常见.很意外,之前遇到上传图片的时候都不需要预览,也一直没有去实现过.现在手上的项目又需要有图片预览功能,所以就动手做了一个小插件.在此分享一下思路. 一.实现图片预览的一些方 ...
- HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术
最近做项目在前端我使用了很多新技术,这些技术有bootstrap.angularjs,不过最让我兴奋的还是使用了HTML5的技术,今天我想总结一些HTML5的技术,好记性不如烂笔头,写写文章可以很好的 ...
- 对百度的UEditor多图片上传的一些补充
我已经写了一篇文章关于百度的UEditor提取多图片上传模块.如果还没有看过,请点击以下链接查看 http://www.cnblogs.com/luke1006/p/3719029.html 出差了两 ...
- 使用localResizeIMG3+WebAPI实现手机端图片上传
前言 惯例~惯例~昨天发表的使用OWIN作为WebAPI的宿主..嗯..有很多人问..是不是缺少了什么 - - 好吧,如果你要把OWIN寄宿在其他的地方...代码如下: namespace Conso ...
- TinyMCE的使用(包括汉化及本地图片上传功能)
TinyMCE我就不多介绍了,这是下载地址:https://www.tinymce.com/download/ 下载下来是英文版,要汉化也很简单.首先去网上随便下载个汉化包,然后把汉化包解压后的lan ...
- 包含修改字体,图片上传等功能的文本输入框-Bootstrap
通过jQuery Bootstrap小插件,框任何一个div转换变成一个富文本编辑框,主要特色: 在Mac和window平台下自动针对常用操作绑定热键 可以拖拽插入图片,支持图片上传(也可以获取移动设 ...
- PHP多图片上传实例demo
upload.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
随机推荐
- 继续写java和socket
上回书说道,java中通过socket链接的两台计算机可以通过两端的两个Socket对象来读取和发送来自流的信息所以对于客户端和服务端只需要封装一个相同的收发信息的窗口就好 代码如下 package ...
- RedHat7系列(Centos/Debian) FireWall 防火墙 设置
RedHat 7 系列之后 系统把默认的iptables 换成了 Firewall 所以我们要适应 这个新的防火墙管理 -------------------服务相关----------------- ...
- centos7下安装nginx
1.yum install epel-release(安装epel(Extra Packages for Enterprise Linux)) 2.yum repolist(确保epel添加到yum的 ...
- 引擎设计跟踪(九.14.2 final) Inverse Kinematics: CCD 在Blade中的实现
因为工作忙, 好久没有记笔记了, 但是有时候发现还得翻以前的笔记去看, 所以还是尽量记下来备忘. 关于IK, 读了一些paper, 觉得之前翻译的那篇, welman的paper (http://gr ...
- 解决ubuntu输入正确用户密码重新跳到无法登录
解决方法:我们需要将.Xauthority的拥有者改为登陆用户(或者干脆将.Xauthority删除,此法转自网上,本人未验证)开机后在登陆界面按下shift + ctrl + F1进入tty命令行终 ...
- javaScript中的redirect
<script type="text/javascript"> <!-- window.location = "http://www.google.co ...
- ISE_pll_ip的建立
创建clk的ip核以及设置PLL的时钟输出 原理:外部晶振输入50M的频率,由ip核输出想要的频率 1.新建工程model再在"芯片"名称上建立clk的ip核 2.设置输入写为50 ...
- Excel与Google Sheets中实现线性规划求解
很久没更新过APS系列文章了,这段时间项目工作确实非常紧,所以只能抽点时间学习一下运筹学的入门知识,算是为以后的APS项目积累点基础.看了一些运筹学的书(都是科普级别的)发现原来我目前面对的很多排产. ...
- postfix配置&使用
myorigin = $mydomain #以“user@example.com”(而不是“user@hostname.example.com”)发送邮件, #这样就没有理由将邮件发送到“user@h ...
- python基础知识17---装饰器2
函数式编程复习: def map_test(func,array): array_new=[] for i in array: array_new.append(func(i)) return arr ...