Amazon S3 - 您建议的上传小于允许的最小大小

nie*_*lsv 9 php file-upload amazon-s3 minimum-size amazon-web-services

当我想将图像上传到我的亚马逊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());
}
Run Code Online (Sandbox Code Playgroud)

(我已经更改了存储桶,按键和图像链接.)
以前有人有这个吗?在互联网上搜索对我没什么帮助.
此外,搜索更改最小上传大小并没有提供太多帮助.

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

Pau*_*aul 13

最小多载大小为5MB(1).您可能希望使用"正常"上传,而不是分段上传.

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

  • 分段上传API可以上传任意大小的对象.唯一的要求是除了last之外的每个"部分"必须至少为5MB,这就是问题:fread()返回一个小于5MB的字符串. (4认同)
  • 谢谢,令人烦恼的是,在调用完整的请求之前它不会失败。这也意味着我根本无法使用它,因为上传是生成的并且预先不知道大小。 (4认同)

Jes*_*sse 6

当其中一个部件的尺寸小于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'],
    );
}
Run Code Online (Sandbox Code Playgroud)