Я пытаюсь загрузить изображения в ведро AWS s3, но всегда загружаю 0 байт в ведро.
Я действительно не знаю, почему так происходит.
Кто-нибудь здесь столкнулся с той же проблемой
Вот снимок изображения и кода https://www.awesomescreenshot.com/image/3369121/5ac921c28f569f45d1b51ac2ce7b6da1
use Aws\S3\S3Client;
public function aws_upload(){
require 'vendor/autoload.php';
if (isset($_FILES["left_front"]) && $_FILES["left_front"]["error"] == 0){
$allowed = array("jpg" => "image/jpg", "jpeg" => "image/jpeg", "gif" => "image/gif", "png" => "image/png");
$filename = $_FILES["left_front"]["name"];
$filetype = $_FILES["left_front"]["type"];
$filesize = $_FILES["left_front"]["size"];
}
// Instantiate an Amazon S3 client.
$s3 = new S3Client([
'version' => 'latest',
'region' => AWS_REGION,
'credentials' => [
'key' => ACCESS_KEY_ID,
'secret' => SECRET_ACCESS_KEY
]
]);
$bucketName = 'demokrishna';
$key = basename($filename);
try {
$result = $s3->putObject([
'Bucket' => $bucketName,
'Key' => $key,
'acl' => 'public-read'
// 'ACL' => 'public-read',
]);
echo $result->get('ObjectURL');
} catch (Aws\S3\Exception\S3Exception $e) {
echo "There was an error uploading the file.\n";
echo $e->getMessage();
}
}
Вам необходимо указать Body при вызове putObject, иначе у файла нет содержимого.
Хорошо, спасибо за ответ @jarmod. Если я загружаю изображение, что я должен указать в разделе тела?
@snack_overflow Я проверил правильность заголовков http в данных формы с помощью почтальона.






Вы предоставили сегмент, ключ и ACL, но не предоставили содержимое файла. Вы можете сделать это с помощью Body или SourceFile.
Пример с телом:
$result = $s3Client->putObject([
'Bucket' => $bucket,
'Key' => $key,
'Body' => 'Hello world!',
'ACL' => 'public-read'
]);
Пример с SourceFile:
$file_Path = 'folder/filename.jpg';
$result = $s3Client->putObject([
'Bucket' => $bucket,
'Key' => $key,
'SourceFile' => $file_Path,
'ACL' => 'public-read'
]);
Также обратите внимание, что это «ACL», а не «acl». Пожалуйста, прочтите документация putObject.
$key_bucket = basename($filename);
$result = $s3->putObject([
'Bucket' => $bucketName, // bucketname
'Key' => $key_bucket,
'StorageClass' => 'REDUCED_REDUNDANCY',
'SourceFile' => $value['tmp_name'] //temporary path
]);
Меня устраивает
Проверьте Content-Type в заголовках HTTP - убедитесь, что он правильный.