PHP上傳文件到項目public路徑接口

一、需求

傳2個參數:uid 用戶ID,photo圖片,然後保存到項目相對路徑:public/file/use/天/下,存(相對路徑+唯一文件名)到數據表。

二、實現方式

1、工具:postman
2、框架:TP
就這一句用到了TP的方法,改成你框架的(對應方法/常量)即可

$thinkPath = Env::get('root_path');    //框架應用根目錄,命名空間爲:use think\facade\Env;

三、postman使用

1、上傳單個圖片,請求接口,這裏打印的是 $_FILE[‘photo’]的信息。注意:這裏的photo是沒有中括號[]的。
在這裏插入圖片描述
打印的result結果爲:

array (
  'file_name' => '眼前一亮.jpg',
  'unique_name' => 'pic_5ebe4a48047512.30197208.jpg',
  'save_path' => 'public/file/use/2020-05-15/pic_5ebe4a48047512.30197208.jpg',
  'uid' => '999',
)

2、上傳多個圖片,請求接口,這裏打印的是 $_FILE[‘photo’]的信息。注意:這裏的photo是有中括號[]的。
在這裏插入圖片描述打印的result結果爲:

array (
  0 => 
  array (
    'file_name' => '眼前一亮.jpg',
    'unique_name' => 'pic_5ebe4a5aeb0454.04678583.jpg',
    'save_path' => 'public/file/use/2020-05-15/pic_5ebe4a5aeb0454.04678583.jpg',
    'uid' => '999',
  ),
  1 => 
  array (
    'file_name' => '眼前一亮.jpg',
    'unique_name' => 'pic_5ebe4a5aeb8135.16792457.jpg',
    'save_path' => 'public/file/use/2020-05-15/pic_5ebe4a5aeb8135.16792457.jpg',
    'uid' => '999',
  ),
)

四、實現代碼

<?php

namespace app\index\controller;

use think\facade\Env;

class Ablog extends Base{
    /**
     * 請求方式 POST
     * @return 返回Json數據
     */
    public function test5(){
        $uid = empty($_POST['uid']) ? '' : $_POST['uid'];
        $data = empty($_FILES['photo']) ? [] : $_FILES['photo'];   //文件參數名爲 photo
        if (empty($uid)){
            return 'param [uid] is required';
        }
        if (empty($data)){
            return 'please upload file';
        }

        //上傳單個文件
        $result = $this->uploadOne($data, $uid);
        if ($result){
            $result['uid'] = $uid;  //拼接上 $uid
            // 這裏可以把數據存入數據庫
//            $pictureDao = new PictureDao();
//            $pictureDao->insert($result);
//            var_export($result);
            var_export($result);die();
        }

        /*-----------------------------分割線-----------------------------*/

        //上傳多個文件:打開 /**/ 測試
//        $result = $this->uploadMore($data, $uid);//傳了$uid
        /*$result = $this->uploadMore($data); //沒傳 $uid
        if ($result){
            //由於沒傳$uid,這裏要循環拼接一下$uid數據
            foreach ($result as &$value){   //直接引用賦值
                $value['uid'] = $uid;
            }

            // 這裏可以把數據存入數據庫
//            $pictureDao = new PictureDao();
//            $pictureDao->insertAll($result);
            var_export($result);die();
        }*/
        return json_encode('success');
    }

    /**
     * 單個文件上傳
     * @param $data 文件信息
     * @return array 結果數據
     */
    public function uploadOne($data){
        if ($data['error'] != 0){   //文件上傳異常,直接返回[]
            return [];
        }

        //注意:這裏處理文件名重複的情況,要保證文件名唯一
        //這裏先獲取原文件名的後綴,然後自定義唯一文件名
        $fileName = $data['name'];
        $suffix = substr($fileName, strrpos($fileName, '.'));   //從右查找第一次出現.的位置;然後截取。結果爲.jpg
        $uniqueName = uniqid('pic_', true) . $suffix;//嘗試生成唯一隨機文件名

        $tempFile = $data['tmp_name'];
        list($fileName, $uniqueName, $savePath) = $this->saveFile($tempFile, $uniqueName, $fileName);
        $result = [
            'file_name' => $fileName,
            'unique_name' => $uniqueName,
            'save_path' => $savePath
        ];
        return $result;
    }

    /**
     * 文件批量上傳(可以不傳uid參數)
     * @param $data 文件信息
     * @param $uid 用戶ID(根據實際情況這個參數可以不傳)
     * @return array
     */
//    public function uploadMore($data, $uid){
    public function uploadMore($data){  //不傳$uid,使該方法通用
        //下面這些參數根據實際情況使用
        $names = $data['name'];
        $types = $data['type'];
        $tmpNames = $data['tmp_name'];
        $errors = $data['error'];
        $sizes = $data['size'];

        $result = [];
        $count = count($names);
        for ($i = 0; $i < $count; $i++){
            $error = $errors[$i];
            if ($error != 0){   //文件上傳異常,continue
                continue;
            }

            //注意:這裏處理文件名重複的情況,要保證文件名唯一
            //這裏先獲取原文件名的後綴,然後自定義唯一文件名
            $fileName = $names[$i];
            $suffix = substr($fileName, strrpos($fileName, '.'));   //從右查找第一次出現.的位置;然後截取。結果爲.jpg
            $uniqueName = uniqid('pic_', true) . $suffix;//嘗試生成唯一隨機文件名

            $tempFile = $tmpNames[$i];
            list($fileName, $uniqueName, $savePath) = $this->saveFile($tempFile, $uniqueName, $fileName);
            $result[] = [
//                'uid' => $uid,
                'file_name' => $fileName,
                'unique_name' => $uniqueName,
                'save_path' => $savePath
            ];
        }
        return $result;
    }

    /**
     * 文件保存方法
     * @param $tempFile 臨時存放路徑
     * @param $uniqueName 唯一名字,存放到目錄中的名字
     * @param $fileName 原名字
     * @param string $path 文件存放的目錄
     * @return array
     */
    public function saveFile($tempFile, $uniqueName, $fileName, $path = '/file/use/'){
        $thinkPath = Env::get('root_path');    //框架應用根目錄,命名空間爲:use think\facade\Env;
        $thinkPath = str_replace('\\', '/', $thinkPath);   //把 \\ 替換成 /

        $savePath = 'public' . $path . date('Y-m-d') . '/';   //文件存放的相對路徑(相對應用根目錄)
        $saveDb = $savePath . $uniqueName;//存放到數據表的路徑
        $saveFile = $thinkPath . $saveDb; //文件存放的絕對路徑

        $mkdirPath = $thinkPath . $savePath;
        if (!is_dir($mkdirPath)){    //文件夾不存在,則創建;並給最大權限 777
            mkdir($mkdirPath,0777,true);
            chmod($mkdirPath,0777);
        }

        //法一:先複製,再刪除原文件
//        copy($tempFile, $saveFile); //把臨時存放的文件移動到我們需要保存的目錄
//        unlink($tempFile);  //刪除緩存的文件

        //法二:直接移動原文件
        move_uploaded_file($tempFile, $saveFile);

        return [ $fileName, $uniqueName, $saveDb ];
    }
}

五、保存的文件

在這裏插入圖片描述

六、這張圖片還不錯,分享給大家。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章