Fork me on GitHub

ThinkPHP文件上传接口

文件上传接口

上传在项目/runtime/storage/下,返回的是相对路径.


    /**
     * 文件上传接口
     * param file: /2024-06-11_09-50-43.png
     * return
     * {
     * "status": 1,
     * "msg": "上传成功",
     *  "data": {
     *     "file_path": "/uploads/20240611/6a2282ada486c614e170dff06063527f.png"
     *  }
     * }
     */
    public function uploadAjax()
    {
        // 获取上传的文件
        $file = Request::file('file');// 使用 Facade
		// 或$file = request()->file('file'); // 使用全局辅助函数

        // 验证规则
        $validate = Validate::rule([
            'file' => 'fileExt:jpg,jpeg,png,gif|fileSize:10485760', // 限制文件扩展名和大小
        ]);
        // 验证文件
        if (!$validate->check(['file' => $file])) {
            return json(['status' => 0, 'msg' => $validate->getError()]);
        }

        // 上传文件
        try {
            // $_SERVER['DOCUMENT_ROOT']为/www/wwwroot/项目/public目录
            // 如果使用服务器其他非项目路径,需要在public/.user.ini文件中添加授权的目录,且将该目录设为www用户,权限为766
            // $file->getOriginalName()为文件名称
            $file->move($_SERVER['DOCUMENT_ROOT']."/uploads/",$file->getOriginalName());
            /**
             * 存储在/www/wwwroot/项目名/runtime/storage/下面指定的uploads文件夹中
             * $savename = Filesystem::putFile('uploads', $file);
             */
            return json(['status' => 1, 'msg' => '上传成功', 'data' => ['file_path' => '/' . $savename]]);
        } catch (\Exception $e) {
            return json(['status' => 0, 'msg' => $e->getMessage()]);
        }
    }

FTP服务上传

<?php

namespace app\controller;
use app\Request;

class FtpController
{
    protected $ftp_server = '127.0.0.1'; // FTP 服务器地址,如果公网IP,FTP能连接能创建文件但是大小为0切换127发现成功
    protected $ftp_port = 21;                  // FTP 端口号
    protected $ftp_user = 'ftpuser';          // FTP 用户名
    protected $ftp_pass = 'ftppwd';          // FTP 密码

    // FTP 连接
    private function connect()
    {
        $conn_id = ftp_connect($this->ftp_server, $this->ftp_port);
        if (!$conn_id) {
            return ['error' => '无法连接到 FTP 服务器'];
        }

        if (!@ftp_login($conn_id, $this->ftp_user, $this->ftp_pass)) {
            ftp_close($conn_id);
            return ['error' => 'FTP 登录失败'];
        }

        // 启用被动模式
        ftp_pasv($conn_id, true);

        return $conn_id;
    }

    // 上传文件
    public function uploadAjax(Request $request)
    {
        // 连接到 FTP 服务器
        $conn_id = $this->connect();
        if (isset($conn_id['error'])) return json($conn_id);

        // 从文件输入框获取上传的文件
        $file = $request->file('file'); // 'file' 是文件输入框的名称

        // 检查文件是否上传成功
        if (!$file) {
            return json(['error' => '没有接收到文件']);
        }

        // 将文件保存到服务器的临时目录
        $local_file = $file->getPathname();
        $remote_file = '/' . $file->getOriginalName(); // 目标路径,ftp的根目录下面

        // 上传文件到 FTP 服务器
        if (@ftp_put($conn_id, $remote_file, $local_file, FTP_BINARY)) {
            $result = ['message' => '文件上传成功'];
        } else {
            // 获取错误信息
            $error = error_get_last();
            $result = [
                'error' => '文件上传失败',
                'message' => $error['message'] ?? '未知错误'
            ];
//            $result = ['error' => '文件上传失败'];
        }

        // 关闭 FTP 连接
        ftp_close($conn_id);
        return json($result);
    }

    // 删除文件
    public function deleteFileAjax(Request $request)
    {
        $conn_id = $this->connect();
        if (isset($conn_id['error'])) return json($conn_id);

        $remote_file = $request->param('remote_file'); // 服务器上的文件路径

        if (ftp_delete($conn_id, $remote_file)) {
            $result = ['message' => '文件删除成功'];
        } else {
            $result = ['error' => '文件删除失败'];
        }

        ftp_close($conn_id);
        return json($result);
    }

    // 重命名文件
    public function rename(Request $request)
    {
        $conn_id = $this->connect();
        if (isset($conn_id['error'])) return json($conn_id);

        $old_name = $request->param('old_name'); // 原文件名
        $new_name = $request->param('new_name'); // 新文件名

        if (ftp_rename($conn_id, $old_name, $new_name)) {
            $result = ['message' => '文件重命名成功'];
        } else {
            $result = ['error' => '文件重命名失败'];
        }

        ftp_close($conn_id);
        return json($result);
    }

    // 列出文件
    public function listFilesAjax(Request $request)
    {
        $conn_id = $this->connect();
        if (isset($conn_id['error'])) return json($conn_id);

        $directory = $request->param('directory', '.'); // 默认当前目录
        $file_list = ftp_nlist($conn_id, $directory);
        if ($file_list !== false) {
            $result = ['files' => $file_list];
        } else {
            $result = ['error' => '无法获取文件列表'];
        }

        ftp_close($conn_id);
        return json($result);
    }
}
posted @ 2024-06-11 10:32  秋夜雨巷  阅读(33)  评论(0编辑  收藏  举报