【问题标题】:Amazon S3 - Your proposed upload is smaller than the minimum allowed sizeAmazon S3 - 您建议的上传小于允许的最小大小
【发布时间】:2013-10-22 22:58:21
【问题描述】:

我想将图像上传到我的 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());
}

(我已经更改了存储桶、密钥和图片链接。)
以前有人用过吗?在互联网上搜索对我没有多大帮助。
同时搜索以更改最小上传大小并没有提供太多帮助。

更新
当我使用本地图像(更改文件名)尝试此操作时,它起作用了!如何使用在线图像进行这项工作?现在我将它保存在我的临时文件中,然后从那里上传。但是有没有办法直接存储而不保存在本地呢?

【问题讨论】:

    标签: php file-upload amazon-web-services amazon-s3 minimum-size


    【解决方案1】:

    最小分段上传大小为 5Mb (1)。您可能希望使用“正常”上传,而不是分段上传。

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

    【讨论】:

    • 分段上传API可以上传任意大小的对象。唯一的要求是除了最后一个“部分”之外的每个“部分”都必须至少为 5MB,这就是这里的问题:fread() 返回的字符串大小小于 5MB。
    • 谢谢,令人讨厌的是,在调用完整的请求之前它不会失败。这也意味着我根本无法使用它,因为上传是生成的,并且预先不知道大小。
    • 这个答案不正确。正如其他人指出的那样:last 部分(或 only 部分)实际上可以是任意大小。
    • @Jesse 的答案必须是实际接受的答案。
    【解决方案2】:

    当其中一个部分的大小小于 5MB 并且不是最后一个部分(最后一个部分可以是任何大小)时,会发生此错误。 fread() 可以返回比指定大小更短的字符串,因此您需要继续调用fread(),直到您有至少 5MB 的数据(或者您已到达文件末尾)才能上传该部分。

    所以你的第三步变成了:

    // 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'],
        );
    }
    

    【讨论】:

    • 我遇到了完全相同的问题,如果你上传一个部分,它可以是任意大小,对于多个部分,5mb 是最小值。因此,如果您将内部缓冲区保持至少 5M,那么它将起作用。谢谢@Jesse
    猜你喜欢
    • 1970-01-01
    • 2021-02-18
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多