Я пытаюсь загрузить изображение на s3 с помощью Laravel, но получаю ошибку времени выполнения. Используя Laravel 5.8, PHP7 и API REST с Postman, я отправляю телом base64 Я получаю изображение base64, и я должен загрузить его на s3 и получить URL-адрес запроса.
public function store(Request $request)
{
$s3Client = new S3Client([
'region' => 'us-east-2',
'version' => 'latest',
'credentials' => [
'key' => $key,
'secret' => $secret
]
]);
$base64_str = substr($input['base64'], strpos($input['base64'], ",") + 1);
$image = base64_decode($base64_str);
$result = $s3Client->putObject([
'Bucket' => 's3-galgun',
'Key' => 'saraza.jpg',
'SourceFile' => $image
]);
return $this->sendResponse($result['ObjectURL'], 'message.', 'ObjectURL');
}
Говорит:
RuntimeException: Unable to open u�Z�f�{��zڱ��� .......






Вместо SourceFile вы должны использовать Body. SourceFile — это путь к файлу, но у вас нет файла, у вас исходник img в кодировке base64. Вот почему вам нужно использовать Body, который может быть строкой. Подробнее здесь: https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject
Исправленная версия:
public function store(Request $request)
{
$s3Client = new S3Client([
'region' => 'us-east-2',
'version' => 'latest',
'credentials' => [
'key' => $key,
'secret' => $secret
]
]);
$base64_str = substr($input['base64'], strpos($input['base64'], ",") + 1);
$image = base64_decode($base64_str);
$result = $s3Client->putObject([
'Bucket' => 's3-galgun',
'Key' => 'saraza.jpg',
'Body' => $image
]);
return $this->sendResponse($result['ObjectURL'], 'message.', 'ObjectURL');
}
Параметр SourceFile ведет к дорожка файла для загрузки на S3, а не к двоичному файлу.
Вы можете использовать параметр Body для замены SourceFile или сохранить файл в локальном временном файле и получить путь для SourceFile
Так:
public function store(Request $request)
{
$s3Client = new S3Client([
'region' => 'us-east-2',
'version' => 'latest',
'credentials' => [
'key' => $key,
'secret' => $secret
]
]);
$base64_str = substr($input['base64'], strpos($input['base64'], ",") + 1);
$image = base64_decode($base64_str);
Storage::disk('local')->put("/temp/saraza.jpg", $image);
$result = $s3Client->putObject([
'Bucket' => 's3-galgun',
'Key' => 'saraza.jpg',
'SourceFile' => Storage::disk('local')->path('/temp/saraza.jpg')
]);
Storage::delete('/temp/saraza.jpg');
return $this->sendResponse($result['ObjectURL'], 'message.', 'ObjectURL');
}
И, если вы используете S3 с Laravel, вам следует рассмотреть драйвер файловой системы S3 вместо того, чтобы вручную обращаться к S3Client в вашем контроллере.
Для этого добавьте драйвер S3 composer require league/flysystem-aws-s3-v3, укажите настройки S3 IAM в .env или config\filesystems.php
Затем обновите файловую систему по умолчанию в config\filesystems или укажите драйвер диска при использовании Хранилища Storage::disk('s3')
Подробности см. в документе здесь
Очень простой способ загружает любой файл в хранилище AWS-S3.
Во-первых, проверьте настройки ENV.
AWS_ACCESS_KEY_ID=your key
AWS_SECRET_ACCESS_KEY= your access key
AWS_DEFAULT_REGION=ap-south-1
AWS_BUCKET=your bucket name
AWS_URL=Your URL
Второй FileStorage.php
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
//'visibility' => 'public', // do not use this line for security purpose. try to make bucket private.
],
Теперь приступайте к основному коду. Загрузить бинарный файл из HTML-формы.
$fileName = 'sh_'.mt_rand(11111,9999).".".$imageFile->clientExtension();;
$s3path = "/uploads/".$this::$SchoolCode."/";
Storage::disk('s3')->put($s3path, file_get_contents($req->file('userDoc')));
Upload Base64 FileFor Public Bucket or if you want to keep file Public
$binary_data = base64_decode($file);
Storage::disk('s3')->put($s3Path, $binary_data, 'public');
For Private Bucket or if you want to keep file Private
$binary_data = base64_decode($file);
Storage::disk('s3')->put($s3Path, $binary_data);
Я рекомендую вам сохранить ваш файл в секрете... это более безопасный способ и безопасный. для этого вы должны использовать PreSign в URL-адресе для доступа к этому файлу.
Для URL-адрес для входа перед входом проверьте этот пост. Как получить доступ к изображению в ведре s3, используя предварительно подписанный URL-адрес
'visibility' => 'public', требуется в случае, если сделать файл общедоступным, иначе вы можете оставить его. перед этим вы должны сначала проверить характер вашего ведра.
'видимость' => 'общедоступность', требуется. если кто забудет, то добавьте, что иначе вы не можете получить ни один загруженный файл.