16

Amazon s3 バケットに画像をアップロードするときに問題が発生します。

サイズが 238 KB の jpg 画像をアップロードしようとしています。コードに try/catch を入れて、エラーの内容を確認しました。私はいつもこのエラーを受け取ります:

提案されたアップロードは、許可されている最小サイズよりも小さいです

また、1MB と 2MB の画像でこれを試しましたが、同じエラーが発生しました ... .

これが私のコードです:

<?php

// Include the SDK using the Composer autoloader
require 'AWSSDKforPHP/aws.phar';

use Aws\S3\S3Client;
use Aws\Common\Enum\Size;

$bucket = 'mybucketname';
$keyname = 'images';
$filename = 'thelinktomyimage';

// Instantiate the S3 client with your AWS credentials and desired AWS region
$client = S3Client::factory(array(
    'key'    => 'key',
    'secret' => 'secretkey',
));


// Create a new multipart upload and get the upload ID.
$response = $client->createMultipartUpload(array(
    'Bucket' => $bucket,
    'Key'    => $keyname
));

$uploadId = $response['UploadId'];

// 3. Upload the file in parts.
$file = fopen($filename, 'r');
$parts = array();
$partNumber = 1;
while (!feof($file)) {
    $result = $client->uploadPart(array(
        'Bucket'     => $bucket,
        'Key'        => $keyname,
        'UploadId'   => $uploadId,
        'PartNumber' => $partNumber,
        'Body'       => fread($file, 5 * 1024 * 1024),
    ));
    $parts[] = array(
        'PartNumber' => $partNumber++,
        'ETag'       => $result['ETag'],
    );

}

// Complete multipart upload.
try{
    $result = $client->completeMultipartUpload(array(
        'Bucket'   => $bucket,
        'Key'      => $keyname,
        'UploadId' => $uploadId,
        'Parts'    => $parts,
    ));
    $url = $result['Location'];

    fclose($file);
}
catch(Exception $e){
    var_dump($e->getMessage());
}

(バケット、キー、画像リンクを変更しました。)
以前にこれを持っていた人はいますか?インターネットで検索してもあまり役に立ちませんでした。
また、アップロードの最小サイズを変更するために検索しても、あまり役に立ちませんでした。

更新:
ローカル イメージ (ファイル名を変更) でこれを試したところ、うまくいきました! オンラインの画像でこれを機能させるにはどうすればよいですか? これを一時ファイルに保存し、そこからアップロードします。しかし、ローカルに保存せずに直接保存する方法はありませんか?

4

2 に答える 2

7

このエラーは、パーツのいずれかのサイズが 5 MB 未満であり、最後のパーツではない場合に発生します (最後のパーツは任意のサイズにすることができます)。fread()指定されたサイズよりも短い文字列を返す可能性があるため、fread()その部分をアップロードする前に、少なくとも 5MB のデータを取得する (またはファイルの最後に到達する) まで呼び出しを続ける必要があります。

したがって、3番目のステップは次のようになります。

// 3. Upload the file in parts.
$file = fopen($filename, 'r');
$parts = array();
$partNumber = 1;
while (!feof($file)) {

    // Get at least 5MB or reach end-of-file
    $data = '';
    $minSize = 5 * 1024 * 1024;
    while (!feof($file) && strlen($data) < $minSize) {
        $data .= fread($file, $minSize - strlen($data));
    }

    $result = $client->uploadPart(array(
        'Bucket'     => $bucket,
        'Key'        => $keyname,
        'UploadId'   => $uploadId,
        'PartNumber' => $partNumber,
        'Body'       => $data, // <= send our buffered part
    ));
    $parts[] = array(
        'PartNumber' => $partNumber++,
        'ETag'       => $result['ETag'],
    );
}
于 2014-11-25T02:55:02.120 に答える