博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swoft 图片上传与处理
阅读量:6848 次
发布时间:2019-06-26

本文共 5758 字,大约阅读时间需要 19 分钟。

上传

在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,在移动文件到指定位置时最好判断一下文件夹是否存在,不存在创建


 

图片处理

借助  工具完成

ubuntu下一键安装

I. 安装ImageMagicksudo apt-get install imagemagickII. 安装imagemagick 的lib 供php调用sudo apt-get install libmagick++-devIII. 调用当前的pecl安装imagickpecl install imagickIV. 修改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 80 default_server;        listen [::]:80 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;        }}

 

转载于:https://www.cnblogs.com/xiaoliwang/p/10326399.html

你可能感兴趣的文章
《Head first HTML与CSS 第二版》读书笔记 第九章 盒模型
查看>>
《Python面向对象……》之目录
查看>>
集群入门简析及LB下LVS详解
查看>>
Linux与GPT
查看>>
管理或技术
查看>>
分配到弱属性;对象将在赋值之后释放
查看>>
java作用域public ,private ,protected 及不写时的区别
查看>>
until循环语句
查看>>
Android桌面悬浮窗进阶,QQ手机管家小火箭效果实现
查看>>
提高用户体验方式:饥饿营销
查看>>
Java8中的LocalDateTime工具类
查看>>
Exchange 2013 PowerShell创建自定义对象
查看>>
RAID-10 阵列的创建(软)
查看>>
javaScript的调试(四)
查看>>
nginx不使用正则表达式匹配
查看>>
dell台式机双SATA硬盘开机提示NO boot device available- Strike F1 to retryboot .F2
查看>>
linux下mysql的卸载、安装全过程
查看>>
samba不需密碼的分享
查看>>
利用putty进行vnc + ssh tunneling登录
查看>>
js重定向---实现页面跳转的几种方式
查看>>