【thinkPHP5实现文件上传】

摘要:
ThinkPaPHP 5.0的文件上传支持更简单。假设表单代码如下:然后将以下代码添加到控制器:publicfunctionupload(){//获取表单上载文件。例如,001.jpg$file=request()-˃文件//如果{$info=$file-˃Move;如果{//上传成功,则将其移动到框架应用程序根目录/public/uploads/目录。然后获取上传信息。//输出jpecho$info-˃getExtension();//输出20160820/42a79759f284b767dfcb2a0197904287.jpecho$info-˃getSaveName();/输出42a7979759F284b767DFcb2a019794287.jpecho$info-˃get文件名();}否则{//上传失败。获取错误消息echo$file-˃getError();}}如果move方法成功,它将返回一个hinkFile对象。您可以对上载的文件执行后续操作。

上传文件

ThinkPHP5.0对文件上传的支持更加简单。

内置的上传只是上传到本地服务器,上传到远程或者第三方平台的话需要自己扩展。

假设表单代码如下:

<form action="/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image" /> <br> 
<input type="submit" value="上传" /> 
</form> 

然后在控制器中添加如下的代码:

public function upload(){
    // 获取表单上传文件 例如上传了001.jpg
    $file = request()->file('image');
    
    // 移动到框架应用根目录/public/uploads/ 目录下
    if($file){
        $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
        if($info){
            // 成功上传后 获取上传信息
            // 输出 jpg
            echo $info->getExtension();
            // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
            echo $info->getSaveName();
            // 输出 42a79759f284b767dfcb2a0197904287.jpg
            echo $info->getFilename(); 
        }else{
            // 上传失败获取错误信息
            echo $file->getError();
        }
    }
}

move方法成功的话返回的是一个 hinkFile对象,你可以对上传后的文件进行后续操作。

多文件上传

如果你使用的是多文件上传表单,例如:

<form action="/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image[]" /> <br> 
<input type="file" name="image[]" /> <br> 
<input type="file" name="image[]" /> <br> 
<input type="submit" value="上传" /> 
</form> 

控制器代码可以改成:

public function upload(){
    // 获取表单上传文件
    $files = request()->file('image');
    foreach($files as $file){
        // 移动到框架应用根目录/public/uploads/ 目录下
        $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
        if($info){
            // 成功上传后 获取上传信息
            // 输出 jpg
            echo $info->getExtension(); 
            // 输出 42a79759f284b767dfcb2a0197904287.jpg
            echo $info->getFilename(); 
        }else{
            // 上传失败获取错误信息
            echo $file->getError();
        }    
    }
}

上传验证

支持对上传文件的验证,包括文件大小、文件类型和后缀:

public function upload(){
    // 获取表单上传文件 例如上传了001.jpg
    $file = request()->file('image');
    // 移动到框架应用根目录/public/uploads/ 目录下
    $info = $file->validate(['size'=>15678,'ext'=>'jpg,png,gif'])->move(ROOT_PATH . 'public' . DS . 'uploads');
    if($info){
        // 成功上传后 获取上传信息
        // 输出 jpg
        echo $info->getExtension();
        // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getSaveName();
        // 输出 42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getFilename(); 
    }else{
        // 上传失败获取错误信息
        echo $file->getError();
    }
}

getSaveName方法返回的是图片的服务器文件地址,并不能直接用于图片的URL地址,尤其在windows平台上必须做转换才能正常显示图片。

如果上传文件验证不通过,则move方法返回false。

验证参数说明
size上传文件的最大字节
ext文件后缀,多个用逗号分割或者数组
type文件MIME类型,多个用逗号分割或者数组

还有一个额外的自动验证规则是,如果上传的文件后缀是图像文件后缀,则会检查该文件是否是一个合法的图像文件。

上传规则

默认情况下,会在上传目录下面生成以当前日期为子目录,以微秒时间的md5编码为文件名的文件,例如上面生成的文件名可能是:

/home/www/upload/20160510/42a79759f284b767dfcb2a0197904287.jpg

我们可以指定上传文件的命名规则,使用rule方法即可,例如:

// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用md5规则
$file->rule('md5')->move('/home/www/upload/');

最终生成的文件名类似于:

/home/www/upload/72/ef580909368d824e899f77c7c98388.jpg

系统默认提供了几种上传命名规则,包括:

规则描述
date根据日期和微秒数生成
md5对文件使用md5_file散列生成
sha1对文件使用sha1_file散列生成

其中md5和sha1规则会自动以散列值的前两个字符作为子目录,后面的散列值作为文件名。

如果需要使用自定义命名规则,可以在rule方法中传入函数或者方法,例如:

// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用uniqid规则
$file->rule('uniqid')->move('/home/www/upload/');

生成的文件名类似于:

/home/www/upload/573d3b6d7abe2.jpg

如果你希望保留原文件名称,可以使用:

// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用原文件名
$file->move('/home/www/upload/','');

默认情况下,会覆盖服务器上传目录下的同名文件,如果不希望覆盖,可以使用:

// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且设置不覆盖
$file->move('/home/www/upload/',true,false);

获取文件hash散列值

可以获取上传文件的哈希散列值,例如:

// 获取表单上传文件
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用原文件名
$upload = $file->move('/home/www/upload/');
// 获取上传文件的hash散列值
echo $upload->md5();
echo $upload->sha1();

v5.0.1以上版本可以统一使用hash方法获取文件散列值

// 获取表单上传文件
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用原文件名
$upload = $file->move('/home/www/upload/');
// 获取上传文件的hash散列值
echo $upload->hash('sha1');
echo $upload->hash('md5');

返回对象

上传成功后返回的仍然是一个File对象,除了File对象自身的方法外,并且可以使用SplFileObject的属性和方法,便于进行后续的文件处理。

免责声明:文章转载自《【thinkPHP5实现文件上传】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇FastJson基本使用SVN分支与合并下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux上的oracle巡检脚本

修改自大神博客:http://www.cnblogs.com/jyzhao/p/5364049.html 脚本巡检的优化:自动化,节省时间。 脚本需加强:巡检结果中有大量的sqlplus连接信息,后期考虑用shell只过滤出有用信息,优化查看。 开始介绍: 1.环境sentos67、redhat6 2.可以将脚本放至/home/oracle/checkdi...

shell脚本-批量添加用户

批量添加用户,要求如下 脚本一:不是很严格但是很简洁的脚本 #!/bin/bash #该脚本用来实现批量添加用户。##作者阿鑫#日期2019/5/27#版本v1 #提示用户脚本使用方法 [ $# -eq 0 ] && echo "Usage useradd.sh number" &&exit #判断是否存在/data/u...

批处理脚本

常用dos命令 批处理复制文件(文件夹) 1.复制C:ae.txt 文本文件到d:文件夹下面【复制完的目录结构应该为d:e.txt】xcopy /y c:ae.txt d: >nul2.复制C:a文件夹及其内所有东西(包括隐藏,系统文件)到D:文件夹下面【 a文件夹也要复制过去,也就是说,复制之后,a文件夹应该在b文件夹下】xcopy /y /e...

[shell]简单的shell提示和参数脚本

 该shell脚本有如下点: bash or dash case语句的写法 脚本help写法 参数是否为空的写法 算数运算的写法 #! /bin/bash case "$1" in -h|--help|?) echo "Usage: 1st arg:pin name, 2st arg:reset time" echo "...

如何把双引号包含到echo命令的字符串中

初涉s h e l l的用户常常会遇到的一个问题就是如何把双引号包含到e c h o命令的字符串中。引号是一个特殊字符,所以必须要使用反斜杠来使s h e l l忽略它的特殊含义。假设你希望使用e c h o命令输出这样的字符串:“/ d e v / r m t 0”,那么我们只要在引号前面加上反斜杠即可: $ echo ""/dev/rmt0"" 输出...

TP5整合 WorkerMan 以及 GatewayWorker

TP5整合GatewayWorker Windows版安装 a)使用composer create-project topthink/think testTG,来安装thinkphp5. b)进入thinkphp5的目录,此处为testTG,使用composer require workerman/gateway-worker-for-win 安装Wi...