当前位置: 首页 > 知识库问答 >
问题:

亚马逊S3 -您提议的上传小于允许的最小大小

百里文景
2023-03-14

当我想上传图片到我的亚马逊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());
}

(我已经更改了桶、键和图像链接。)
以前有人有过这个吗?在互联网上搜索对我没有太大帮助。
还搜索更改最小上传大小也没有提供太多帮助。

更新:< br >当我用本地映像(更改了文件名)尝试时,它成功了!我如何用网上的图片来做这件事?现在我把它保存在我的临时文件中,然后从那里上传。但是不是有办法不用保存在本地直接存储吗?

共有2个答案

锺英彦
2023-03-14

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'],
    );
}
谭奕
2023-03-14

多部分上传的最小大小为5Mb (1),即使您的总大小为100MB,每个单独的多部分上传(除了最后一个)也不能小于5Mb。您可能希望使用“普通”上传,而不是多部分上传。

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

 类似资料:
  • 我在Java读取拼花文件时构建了一个XML字符串。该xml字符串需要上传到S3存储桶。 拼花文件最多可以有200万条记录。 将XML文件上载到S3的一种方法是使用AWS的多部分上载API,方法如下: 构建XML字符串后,将该字符串转换为inputstream,并在UploadPart Request对象中使用它来调用s3Client.uploadPart()方法。 提交人: https://doc

  • 您可以使用基于浏览器的上传(不是多部分上传)中的内容长度范围字段来限制文件大小:http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html 你怎么能在多部分上传中限制它?我正在使用EvaporateJS。

  • 我正在尝试使用 java 对亚马逊 S3 进行分段上传。我正在使用下面链接中的代码。 http://docs.aws.amazon.com/AmazonS3/latest/dev/llJavaUploadFile.html 方案 1:要上载的文件大小为 31627。我使用 partSize 作为 500000 来指定单个部件的大小。 由于文件的大小小于部分大小,因此文件将上传到 S3。 方案 2:

  • 问题内容: 我有一个800KB的JPG文件。我尝试上传到S3,并不断收到超时错误。你能弄清楚哪里出了问题吗?800KB很小,无法上传。 错误消息:在超时期限内未读取或写入到服务器的套接字连接。空闲连接将关闭。 HTTP状态码:400 AWS错误代码:RequestTimeout 问题答案: IOUtils.toByteArray是否有可能正在耗尽您的输入流,以便在进行服务调用时不再需要从中读取任何

  • 当用户上传图片时,我正在动态调整图像大小。原始图片存储在Amazon S3上一个名为djangobucket的bucket中。在这个桶中,包含数千个文件夹。 每个文件夹都以用户命名。我不必担心存储桶创建或文件夹创建,因为所有这些都是从客户端处理的。 下图为: 如您所见,Bob有许多图片。一旦用户将图片上传到S3,我就会通过URL通过Django下载它,在这种情况下,它将是:http://s3.am

  • 在GCP上部署Spring启动应用程序时,显示了以下错误。 错误:(gcloud.app.deploy)无法上载文件[/home/info/Project1/target/appengine staging/myproject-0.0.1-SNAPSHOT.jar],该文件的大小为[42865605](大于允许的最大大小[33554432])。请删除该文件或添加到应用程序中的skip\u file