从 PHP 上传多个文件到 Amazon S3

Jon*_*ett 5 php amazon-s3 amazon-web-services

有没有办法一次性上传多个文件,而不必为每个文件重新连接?

我使用 S3 作为我的 php 应用程序的存储,它需要存储大量(一次 100 个)的大多数小(约 10k)图像文件。目前我正在遍历它们并使用以下代码为每个单独上传:

$s3->putObjectFile($uploadFile, $bucketName, ($uploadFile), S3::ACL_PUBLIC_READ)
Run Code Online (Sandbox Code Playgroud)

这需要很长时间。对于 1.5 兆文件,大约一分钟。按照其他答案中的建议关闭 SSL 会减少到大约 40 秒,但这仍然很慢。

这是我当前的代码,使用适用于 PHP 的 Amazon S3 REST 实现

$s3 = new S3($awsAccessKey, $awsSecretKey, false);


function send_to_s3($s3, $bucketName, $uploadFile)

{

    $start = microtime(true);



// Check if our upload file exists
if (!file_exists($uploadFile) || !is_file($uploadFile))
    exit("\nERROR: No such file: $uploadFile\n\n");

// Check for CURL
if (!extension_loaded('curl') && !@dl(PHP_SHLIB_SUFFIX == 'so' ? 'curl.so' : 'php_curl.dll'))
    exit("\nERROR: CURL extension not loaded\n\n");



if ($s3->putObjectFile($uploadFile, $bucketName, ($uploadFile), S3::ACL_PUBLIC_READ)) 
    {

    $end = microtime(true);

    $took = $end - $start;

    echo "S3::putObjectFile(): File copied to {$bucketName}/".($uploadFile).PHP_EOL . ' - ' . filesize($uploadFile) . ' in ' . $took . ' seconds<br />';

    return $took;
    }
else
    {
    print 'error';  
    }

}
Run Code Online (Sandbox Code Playgroud)

感谢任何帮助。

小智 1

我建议通过分段上传来上传图像。

下面的代码是使用 Aws-sdk 版本 3 的基本示例。

use Aws\S3\MultipartUploader;
use Aws\Exception\MultipartUploadException;

$uploader = new MultipartUploader($s3Client, '/path/to/large/file.zip', [
    'bucket' => 'your-bucket',
    'key'    => 'my-file.zip',
]);

try {
    $uploader->upload();
    echo "Upload complete.\n";
} catch (MultipartUploadException $e) {
    echo $e->getMessage() . "\n";
}
Run Code Online (Sandbox Code Playgroud)