6

amazon s3バケットに画像をアップロードするときに問題が発生しています。
Amazon S3 - 提案されたアップロードが許可されている最小サイズより小さい

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

Your proposed upload is smaller than the minimum allowed size

私も1メガバイトと2メガバイト、同じエラーからの画像でこれを試してみました...。ここで

は私のコードです:

<?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()); 
} 

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

UPDATE:私は、ローカルの画像でこれを試してみました
は、(ファイル名を変更)は、それが働きました!オンラインの画像でこの作業を行うにはどうすればよいですか?今、私はそれを私の一時ファイルに保存し、そこからアップロードします。しかし、ローカルに保存せずに直接保存する方法はありませんか?

答えて

11

最小マルチパートアップロードサイズは5MBです。おそらくマルチパートアップロードではなく、「通常の」アップロードを使用したいと思うでしょう。部品のサイズが5メガバイト未満であり、最後の部分でない場合

(1)http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html

+3

マルチパートアップロードAPIは、任意のサイズのオブジェクトをアップロードすることができます。唯一の要件は、最後の部分を除くすべての "部分"が少なくとも5MBでなければならないということです。fread()は5MB未満の文字列を返します。 – Jesse

4

このエラーが発生した(最後の部分は、任意のサイズであってもよいです)。 fread()は、指定されたサイズよりも短い文字列を返すことができるので、その部分をアップロードする前に少なくとも5MBのデータがある(またはファイルの最後に達した)まで、fread()を呼び出す必要があります。

だからあなたの第三段階は、次のようになります。

// 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'], 
    ); 
} 
関連する問題