PHP8上传文件至AWS触发Uncaught InvalidArgumentException求助
PHP8下AWS S3文件上传报错(原PHP5代码正常)
原PHP5中可正常运行的AWS S3文件上传代码,在PHP8环境下抛出异常:
类型:Guzzle\Common\Exception\InvalidArgumentException
消息:Invalid handle provided
原代码如下:
$s3 = S3Client::factory( array( 'credentials' => array( 'key' => IAM_KEY, 'secret' => IAM_SECRET ), 'version' => 'latest', 'region' => 'eu-west-1' ) ); $s3->putObject( array( 'Bucket' => RUTA_REPOSITORIO, 'Key' => $_FILES['Archivo_'.$i]['name'], 'SourceFile' => $_FILES['Archivo_'.$i]['tmp_name'] //'Body' => $_FILES['Archivo_'.$i]['tmp_name'] ) );
问题原因及解决办法
1. SDK版本不兼容PHP8
旧版本AWS SDK(依赖Guzzle 3)完全不支持PHP8,需升级到AWS SDK for PHP v3(要求PHP 7.2.5+,兼容PHP8)。
2. 废弃的客户端创建方法
原代码中S3Client::factory()已被弃用,新版本需使用create()方法创建客户端。
3. 临时文件有效性验证
PHP8对文件资源的处理更严格,需确保上传的临时文件存在且可读。
修改后的代码示例
use Aws\S3\S3Client; // 创建S3客户端(新版本方式) $s3 = S3Client::create([ 'credentials' => [ 'key' => IAM_KEY, 'secret' => IAM_SECRET, ], 'version' => 'latest', 'region' => 'eu-west-1', ]); // 验证上传状态与临时文件 $file = $_FILES['Archivo_'.$i]; if ($file['error'] !== UPLOAD_ERR_OK) { throw new Exception('文件上传失败,错误码:' . $file['error']); } $tmpPath = $file['tmp_name']; if (!file_exists($tmpPath) || !is_readable($tmpPath)) { throw new Exception('临时文件无效或无法读取'); } // 执行上传 $s3->putObject([ 'Bucket' => RUTA_REPOSITORIO, 'Key' => $file['name'], 'SourceFile' => $tmpPath, ]);
额外注意事项
- 通过Composer安装最新版SDK:
composer require aws/aws-sdk-php - 避免直接使用用户上传的文件名作为S3的
Key,建议添加前缀或重命名,防止文件名冲突或安全问题。
内容的提问来源于stack exchange,提问作者Rubius
相关产品推荐
相关产品推荐

