上传

在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;
}
}

最新文章

  1. 0035 Java学习笔记-注解
  2. python 线程之 threading(二)
  3. 知道吗?9个搜索引擎优化(SEO)最佳实践
  4. Meaningful Use 中与HL7相关的消息及医疗文档
  5. 使用POI getCell 获取空的单元格之后在使用的时候报 NullPointerException
  6. Visual Studio 2010 更新NuGet Package Manager出错解决办法
  7. POJ3087Shuffle'm Up(map)
  8. eclipse中如何设置tomcat启动时间
  9. jquery插件封装思路整理
  10. HTML5基本标签的使用
  11. 63、django之模版层(template)
  12. Flink--Window apply
  13. 从零开始一起学习SLAM | 神奇的单应矩阵
  14. bzoj 2936 [Poi 1999] 降水 - 并查集
  15. 【腾讯开源】前端预处理器语言图形编译工具 Koala使用指南
  16. 使用pyspark模仿sqoop从oracle导数据到hive的主要功能(自动建表,分区导入,增量,解决数据换行符问题)
  17. 命令行修改MySQL数据库密码
  18. 非抢占式RCU中关于grace period的处理(限于方法)
  19. Oracle的闪回技术--闪回已删除的表
  20. [转载并收藏]JavaScript 疲劳终极指南:我们行业的真相

热门文章

  1. 对TSNU网站的初步分析
  2. Linux系统下安装Angular2开发环境(Ubuntu16.0和deepin)
  3. 解决C#程序只允许运行一个实例的几种方法详解
  4. Skin Microstructure Deformation with Displacement Map Convolution项目小结
  5. WMware 中CentOS系统Hadoop 分布式环境搭建(一)——Hadoop安装环境准备
  6. MySQL-count(*)和count(1)的查询区别
  7. laravel-admin安装时执行php arisan admin:install 命令时报SQLSTATE[42000]: Syntax error or acce ss violation: 1071 Specified key was too long; max key length is 1000 bytes
  8. source insight 中文乱码解决方法
  9. 2018-2019-2 20165312《网络攻防技术》Exp2 后门原理与实践
  10. Java邮件发送