6

Ich habe Probleme, wenn ich ein Bild in meinen Amazon S3-Bucket hochladen möchte.
Amazon S3 - Ihr vorgeschlagener Upload ist kleiner als die minimal zulässige Größe

Ich versuche ein JPG-Bild mit der Größe von 238 KB hochzuladen. Ich habe versucht, meinen Code zu testen, um zu sehen, was der Fehler war. Ich bekomme immer diesen Fehler:

Ich habe das auch mit Bildern von 1MB und 2MB versucht, der gleiche Fehler ...

Hier ist mein Code: (i. Die Eimer, Schlüssel und Bildverbindung geändert haben)

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


Hat jemand vorher hatte? Die Suche im Internet hat mir nicht viel geholfen.
Auch die Suche nach der minimalen Upload-Größe hat nicht viel geholfen.

UPDATE:
Als ich versuchte, diese mit einem lokalen Bild (geändert den Dateinamen), es funktionierte! Wie kann ich mit einem Online-Bild arbeiten? Jetzt speichere ich es in meiner temporären Datei und lade es von dort hoch. Aber gibt es keine Möglichkeit, es direkt zu speichern, ohne es lokal zu speichern?

Antwort

11

Die minimale mehrteilige Upload-Größe beträgt 5 MB (1). Sie möchten wahrscheinlich einen "normalen" Upload verwenden, keinen mehrteiligen Upload.

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

+3

Die mehrt Upload API-Objekte beliebiger Größe hochladen. Die einzige Voraussetzung ist, dass jedes "Teil" außer dem letzten mindestens 5 MB groß sein muss, was das Problem ist: fread() gibt einen String zurück, der weniger als 5 MB groß ist. – Jesse

4

Dieser Fehler tritt auf, wenn eines der Teile weniger als 5 MB groß ist und nicht der letzte Teil (der letzte Teil kann beliebig groß sein). fread() kann eine Zeichenfolge zurückgeben, die kürzer als die angegebene Größe ist. Daher müssen Sie fread() aufrufen, bis mindestens 5 MB Daten vorhanden sind (oder Sie das Ende der Datei erreicht haben), bevor Sie diesen Teil hochladen.

So Ihre dritte Schritt wird:

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