假设表单代码如下:

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

  1. public function upload(){
  2. // 获取表单上传文件 例如上传了001.jpg
  3. $file = request()->file('image');
  4. // 移动到框架应用根目录/public/uploads/ 目录下
  5. if($file){
  6. $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
  7. if($info){
  8. // 成功上传后 获取上传信息
  9. // 输出 jpg
  10. echo $info->getExtension();
  11. // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
  12. echo $info->getSaveName();
  13. // 输出 42a79759f284b767dfcb2a0197904287.jpg
  14. echo $info->getFilename();
  15. }else{
  16. // 上传失败获取错误信息
  17. echo $file->getError();
  18. }
  19. }

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

多文件上传

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

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

控制器代码可以改成:

  1. public function upload(){
  2. // 获取表单上传文件
  3. $files = request()->file('image');
  4. foreach($files as $file){
  5. // 移动到框架应用根目录/public/uploads/ 目录下
  6. $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
  7. if($info){
  8. // 成功上传后 获取上传信息
  9. // 输出 jpg
  10. echo $info->getExtension();
  11. // 输出 42a79759f284b767dfcb2a0197904287.jpg
  12. echo $info->getFilename();
  13. }else{
  14. // 上传失败获取错误信息
  15. echo $file->getError();
  16. }
  17. }

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

上传规则

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

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

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

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

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

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

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

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

生成的文件名类似于:

  1. /home/www/upload/573d3b6d7abe2.jpg

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

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

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

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

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

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

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

返回对象