thinkphp8\guzzlehttp上传文件应用示例

发布于:2025-07-21 ⋅ 阅读:(12) ⋅ 点赞:(0)
use GuzzleHttp\Client;
use GuzzleHttp\Psr7; // 这个必须引用;
use think\Request;
use think\response\Json;

public function uploadMultipleFiles(Request $request): Json
    {
        $user = input('post.user');
        $database = input('post.database');
        
        // 获取上传的文件数组
        $files = $request->file('files');
        if (empty($files)) {
            return json(['code' => 400, 'message' => 'No files uploaded']);
        }
    
        // 准备 Guzzle HTTP 客户端
        $client = new Client();
    
        // 使用 array_map 遍历文件数组,简化代码
        $multipartData = array_map(function($file) {
            return [
                'name'     => 'files',  // 通过 Guzzle 会自动处理多文件上传
                'contents' => Psr7\Utils::tryFopen($file->getPathname(), 'rb'), // 二进制读取
                'filename' => $file->getOriginalName(),
                'headers'  => [
                    'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
                ]
            ];
        }, $files);
        
        // 合并文件数据与其他表单数据
        $multipartData = array_merge($multipartData, [
            ['name' => 'database', 'contents' => $database],
            ['name' => 'confirm', 'contents' => true], // confirm 字段传布尔值
        ]);
        // dd($multipartData);
        try {
            // 发送请求
            $response = $client->request('POST', 'http://IP:6097/upload-multiple?user=' . $user, [
                'multipart' => $multipartData
            ]);
    
            // 获取并处理响应
            $body = $response->getBody()->getContents();
            $data = json_decode($body, true);
    
            return json(['code' => 200, 'message' => 'Files uploaded successfully', 'data' => $data]);
    
        } catch (\Exception $e) {
            // 简化异常处理
            return json(['code' => 500, 'message' => 'Upload failed: ' . $e->getMessage()]);
        }
    }

环境:tp8.0及以上版本、php8.3、guzzlehttp7.9

测试无误,欢迎大家指正。


网站公告

今日签到

点亮在社区的每一天
去签到