You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:45:34