上传

在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 图片上传与处理的更多相关文章

  1. Asp.Net Mvc 使用WebUploader 多图片上传

    来博客园有一个月了,哈哈.在这里学到了很多东西.今天也来试着分享一下学到的东西.希望能和大家做朋友共同进步. 最近由于项目需要上传多张图片,对于我这只菜鸟来说,以前上传图片都是直接拖得控件啊,而且还是 ...

  2. 06.LoT.UI 前后台通用框架分解系列之——浮夸的图片上传

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  3. JS图片上传预览插件制作(兼容到IE6)

    其实,图片预览功能非常地常见.很意外,之前遇到上传图片的时候都不需要预览,也一直没有去实现过.现在手上的项目又需要有图片预览功能,所以就动手做了一个小插件.在此分享一下思路. 一.实现图片预览的一些方 ...

  4. HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术

    最近做项目在前端我使用了很多新技术,这些技术有bootstrap.angularjs,不过最让我兴奋的还是使用了HTML5的技术,今天我想总结一些HTML5的技术,好记性不如烂笔头,写写文章可以很好的 ...

  5. 对百度的UEditor多图片上传的一些补充

    我已经写了一篇文章关于百度的UEditor提取多图片上传模块.如果还没有看过,请点击以下链接查看 http://www.cnblogs.com/luke1006/p/3719029.html 出差了两 ...

  6. 使用localResizeIMG3+WebAPI实现手机端图片上传

    前言 惯例~惯例~昨天发表的使用OWIN作为WebAPI的宿主..嗯..有很多人问..是不是缺少了什么 - - 好吧,如果你要把OWIN寄宿在其他的地方...代码如下: namespace Conso ...

  7. TinyMCE的使用(包括汉化及本地图片上传功能)

    TinyMCE我就不多介绍了,这是下载地址:https://www.tinymce.com/download/ 下载下来是英文版,要汉化也很简单.首先去网上随便下载个汉化包,然后把汉化包解压后的lan ...

  8. 包含修改字体,图片上传等功能的文本输入框-Bootstrap

    通过jQuery Bootstrap小插件,框任何一个div转换变成一个富文本编辑框,主要特色: 在Mac和window平台下自动针对常用操作绑定热键 可以拖拽插入图片,支持图片上传(也可以获取移动设 ...

  9. PHP多图片上传实例demo

    upload.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

随机推荐

  1. 改变一下主要发博的方向吧...转scratch!

    因为expression2实在是没什么好说的,BUI,水滴鱼大佬还有其他贴吧上的大佬,实在是多得不行,我一个小人物也说不了什么,然而scratch我却可以多发发脚本,思路,美工啊等等.所以以后我就主要 ...

  2. redis过期机制

    Redis会自己回收清理不用的数据吗? 如果能,那如何配置? 如果不能,如何防止数据累加后大量占用存储空间的问题? 之前一直接触Redis不是很深入,最近项目当中遇到一个需求场景,需要清空一些存放在R ...

  3. HNOI2006公路修建问题

    https://www.luogu.org/problemnew/show/P2323 [题目描述] OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发 ...

  4. test png

    $x^2 \int $ When $a \ne 0$, there are two solutions to (ax^2 + bx + c = 0) and they are $$x = {-b \p ...

  5. day-11函数的形参与实参

    形参与实参 参数介绍: 函数为什么要有参数:因为内部的函数体需要外部的数据 怎么定义函数的参数:在定义函数阶段,函数名后面()中来定义函数的参数 怎么使用函数的参数:在函数体中用定义的参数名直接使用 ...

  6. Python 反射(reflection)

    反射是指通过字符串映射或修改程序运行时的状态.属性.方法, 有以下4个方法 1.getattr(object, name, default = None) 根据字符串获取 obj 对象里对应 str ...

  7. Docker系列(三)Dockerfile 离线构建镜像

    一.Dockfile介绍: Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfil ...

  8. Introduction to Parallel Computing

    Copied From:https://computing.llnl.gov/tutorials/parallel_comp/ Author: Blaise Barney, Lawrence Live ...

  9. RDLC报表系列--------报表分页显示标题

    RDLC表格标题分页后,标题不显示网上的办法也不少.怎奈我试过很多,只有这个可以解决.留下代码以后使用 将报表以 XML的方式打开,搜索找到“详细信息” 在这个位置 报表分页标题设置<Tabli ...

  10. 6.824 LAB1 环境搭建

    MIT 6.824 LAB1 环境搭建 vmware 虚拟机 linux ubuntu server   安装 go 官方安装步骤: 下载此压缩包并提取到 /usr/local 目录,在 /usr/l ...