2015-04-05 3 views
3

Я нахожусь в экземпляре EC2, и я хочу связать свой PHP-сайт с моим ковшом Amazon S3, я уже видел API для PHP здесь: http://aws.amazon.com/sdkforphp/, но это не ясно.Как я могу сохранить загруженные изображения в AWS S3 на PHP

Это строка кода мне нужно редактировать в мой контроллер:

thisFu['original_img']='/uploads/fufu/'.$_POST['cat'].'/original_'.uniqid('fu_').'.jpg'; 

Мне нужно подключить к Amazon S3 и быть в состоянии изменить код так:

$thisFu['original_img']='my_s3_bucket/uploads/fufu/'.$_POST['cat'].'/original_'.uniqid('fu_').'.jpg'; 

Я уже настроил пользователя IAM для этой цели, но я не знаю всех шагов, необходимых для выполнения задания.

Как подключить и взаимодействовать с Amazon S3 для загрузки и получения общедоступных изображений?

UPDATE

Я решил попробовать использовать s3fs как это было предложено, чтобы я установил его, как описано here (моя ОС Ubuntu 14,04)

я бегу из консоли:

sudo apt-get install build-essential git libfuse-dev libcurl4-openssl-dev libxml2-dev mime-support automake libtool 
sudo apt-get install pkg-config libssl-dev 
git clone https://github.com/s3fs-fuse/s3fs-fuse 
cd s3fs-fuse/ 
./autogen.sh 
./configure --prefix=/usr --with-openssl 
make 
sudo make install 

Все было правильно установлено, но что дальше? Где я должен объявлять учетные данные и как я могу использовать эту интеграцию в моем проекте?

второй ОБНОВЛЕНИЕ

Я создал файл с именем .passwd-s3fs с одной строки кода с моей IAM полномочий accessKeyId:secretAccessKey.

я поместить его в мой каталог home/ubuntu и дать ему 600 разрешения с chmod 600 ~/.passwd-s3fs

Далее из консоли я бег /usr/bin/s3fs My_S3bucket /uploads/fufu

/uploads/fufu Внутри есть все мое ведро папки в настоящее время. Однако, когда я пытаюсь эту команду:

s3fs -o nonempty allow_other My_S3bucket /uploads/fufu 

Я получаю сообщение об ошибке:

s3fs: unable to access MOUNTPOINT My_S3bucket : No such file or directory 

3rd UPDATE

Как предложил мне запустить этот fusermount -u /uploads/fufu, после этого я проверил папку FUFU и как и ожидалось. После этого я попробовал еще раз эту команду (с еще одним -о):

s3fs -o nonempty -o allow_other My_S3bucket /uploads/fufu 

и получил сообщение об ошибке:

fusermount: failed to open /etc/fuse.conf: Permission denied 
fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf 

Любые другие предложения?

четвёртой UPDATE 18/04/15

Под предложением от консоли я бег sudo usermod -a -G fuse ubuntu и sudo vim /etc/fuse.conf где я раскомментировал mount_max = 1000 и user_allow_other

Чем я бег s3fs -o непустого -o allow_other My_S3bucket/uploads/fufu

На первый взгляд нет ошибок, поэтому я думал, что все отлично, но все наоборот.

Я немного расстроен сейчас, потому что я не знаю, что случилось, но моя папка /uploads/fufu скрыт и с помощью ls -Al я вижу только этот

d????????? ? ?  ?    ?   ? fufu 

Я не могу sudo rm -r или -rf или mv -r он говорит, что /uploads/fufu is a directory

Я пытался использовать reboot exit and mount -a, но ничего.

Я попытался отключить с помощью fusermount и сообщение об ошибке fusermount: entry for /uploads/fufu not found in /etc/mtab

Но я попытался Судо VIM/и т.д./mtab и я нашел эту строку: s3fs /uploads/fufu fuse.s3fs rw,nosuid,nodev,allow_other 0 0

Может кто-нибудь сказать мне, как я могу отмонтируется и, наконец, удалить эту папку /uploads/fufu?

ответ

1

Несмотря на то, что S3fs является очень надежным le в последних сборках », я могу поделиться своим опытом с s3fs и информацией, что мы переместили операцию записи из прямого доступа к папке s3fs в консоль aws (возможно также SDK api) после периодических случайных сбоев системы.

Возможно, у вас не возникнет проблем с файлами небольшого размера, такими как изображения, но это, безусловно, создало проблему, когда мы пытались написать файлы mp4. Таким образом, последнее сообщение в журнале до сбоя системы было:

kernel: [ 9180.212990] s3fs[29994]: segfault at 0 ip 000000000042b503 sp 00007f09b4abf530 error 4 in s3fs[400000+52000] 

и было редким случайным случаем, но это сделало систему неустойчивой.

Поэтому мы решили все-таки держать s3fs установлен, но использовать его только доступ для чтения

Ниже я покажу, как установить s3fs с учетными данными МВС без файла паролей

#!/bin/bash -x 
S3_MOUNT_DIR=/media/s3 
CACHE_DIR=/var/cache/s3cache 

wget http://s3fs.googlecode.com/files/s3fs-1.74.tar.gz 
tar xvfz s3fs-1.74.tar.gz 
cd s3fs-1.74 
./configure 
make 
make install 

mkdir $S3_MOUNT_DIR 
mkdir $CACHE_DIR 

chmod 0755 $S3_MOUNT_DIR 
chmod 0755 $CACHE_DIR 

export IAMROLE=`curl http://169.254.169.254/latest/meta-data/iam/security-credentials/` 

/usr/local/bin/s3fs $S3_BUCKET $S3_MOUNT_DIR -o iam_role=$IAMROLE,rw,allow_other,use_cache=$CACHE_DIR,uid=222,gid=500 

Кроме того, необходимо будет создать IAM роль, присвоенная к экземпляру с прикрепленными политиками:

{"Statement":[{"Resource":"*","Action":["s3:*"],"Sid":"S3","Effect":"Allow"}],"Version":"2012-10-17"} 

в вас так, кажется, имеет смысл использовать PHP SDK (другой ответ имеет использование exampl е уже), но вы также можете записывать изображения на s3 с AWS консолью:

aws s3 cp /path_to_image/image.jpg s3://your_bucket/path 

Если у вас будет IAM роль созданной и назначенной экземпляр вам не нужно будет предоставлять какие-либо дополнительные полномочия

Обновление - ответьте на ваш вопрос:

  • Мне не нужно включать заводские методы для объявления моих учетных данных IAM?

Да, если у вас будет IAM назначены EC2 экземпляра, то в коде вам просто нужно создать клиент, как:

 $s3Client = S3Client::factory(); 
    $bucket = 'my_s3_bucket'; 
    $keyname = $_POST['cat'].'/original_'‌​.uniqid('fu_').'.jpg'; 
    $localFilePath = '/local_path/some_image.jpg'; 

$result = $s3Client->putObject(array(
     'Bucket' => $bucket, 
     'Key' => $keyname, 
     'SourceFile' => $filePath, 
     'ACL' => 'public-read', 
     'ContentType' => 'image/jpeg' 
    )); 
    unlink($localFilePath); 

вариант 2: Если вам не нужен файл локального этапа хранения, но поместит direclt от формы загрузки:

$s3Client = S3Client::factory(); 
$bucket = 'my_s3_bucket'; 
$keyname = $_POST['cat'].'/original_'‌​.uniqid('fu_').'.jpg'; 
$dataFromFile = file_get_contents($_FILES['uploadedfile']['tmp_name']); 

$result = $s3Client->putObject(array(
    'Bucket' => $bucket, 
    'Key' => $keyname, 
    'Body' => $dataFromFile, 
    'ACL' => 'public-read', 
)); 

А чтобы получить s3 ссылку, если у вас будет доступ общественности

$publicUrl = $s3Client->getObjectUrl($bucket, $keyname); 

Или генерировать подписанный URL для частного содержания:

$validTime = '+10 minutes'; 
$signedUrl = $s3Client->getObjectUrl($bucket, $keyname, $validTime); 
+0

спасибо за предложение ... Мне нравится использовать php sdk, но не знаю, как это сделать, вы говорите, что мне не нужно включать фабричный метод для объявления моих учетных данных IAM? Возможно ли сделать переменную для URL-кода bucket и использовать ее как: 'my_s3_bucket = 'http: // link/to/my/s3', а затем' $ thisFu [' original_img '] =' my_s3_bucket/uploads/fufu/'. $ _ POST [' cat '].'/Original _ '. Uniqid (' fu _ ').'. Jpg '; '? – NineCattoRules

+0

Извините за задержку, но я не получаю уведомление о новом обновлении. Ничего себе, спасибо за ваше замечательное и подробное объяснение, это кажется таким легким ... Вместо этого дней назад я попробовал с s3fs, и теперь моя папка загрузки скрыта и недоступна (вы можете прочитать мое 4-е обновление выше). Я хочу попробовать этот метод, но пока у меня не возникнет проблема с моей папкой загрузки, я даже не могу попробовать. – NineCattoRules

+1

Я думаю, что если я просто сделаю редактирование сообщения, тогда уведомление не появится ... Я был рад, что информация была полезной для вас :) о вашей проблеме при обновлении 4: Я немного потерял, что именно ваша проблема? Отключить s3fs? Почему вы не можете просто перейти в исходную папку и сделать: «sudo make uninstall»? Кстати, я вижу, что вы упомянули о некоторых проблемах с разрешениями, вы делали команды от root или sudo? –

1

Согласен, что документация по этой ссылке немного сложна для поиска и оставляет много точек для подключения.

Однако, я нашел что-то намного лучше здесь: http://docs.aws.amazon.com/aws-sdk-php/v2/guide/service-s3.html

имеет образец кода и инструкции для почти всех операций S3.

+0

Привет, после подключения, как я мог автоматически загружать на ведро фотографии, которые загружаете пользователей? Мой код выглядит так: '$ this ['original_img'] = '/ uploads/img /'.$_ POST [' cat '].'/Original _ '. Uniqid (' my _ ').'. Jpg ';' Спасибо – NineCattoRules

+0

@Simone Вы видели раздел «Загрузка файла» на этой странице? –

+0

@Simone Что вы подразумеваете под константой, используемой для URL? Вы можете указать параметры функции, чтобы сделать файл общедоступным или приватным. –

1

Чтобы дать вам немного больше ясности, так как вы новичок: загрузить AWS SDK с помощью этого Installation Guide

Затем настроить ваш клиент учетной записи AWS на РНР веб-сервер, используя этот бит

use Aws\S3\S3Client; 

$client = S3Client::factory(array('profile' => '<profile in your aws credentials file>' 
)); 

Если вы хотите получить больше информации о том, как использовать AWS учетных данных файлов, head here.

Затем, чтобы загрузить файл, который вы имеете на своем собственном сервере PHP:

$result = $client->putObject(array(
'Bucket'  => $bucket, 
'Key'  => 'data_from_file.txt', 
'SourceFile' => $pathToFile, 
'Metadata' => array(
    'Foo' => 'abc', 
    'Baz' => '123' 
) 
)); 

Если вам интересно узнать, как загружать изображения в файл php, я бы рекомендовал посмотреть на this W3 schools tutorial.. Это руководство поможет вам с легкостью сохранить файл локально на вашем сервере во временном каталоге, прежде чем он получит загружен в ваш ведро S3.

+0

Наконец-то кто-то! Спасибо за ответ, однако я не могу установить ничего подобного, действительно, я на Amazon EC2 ... это сложно? Я подумал, что достаточно взять все папки и поместить их в корневой каталог. – NineCattoRules

+1

В первой ссылке для установки SDK перейдите в инструкцию «Установить из zip», а вместо строки «используйте Aws \ S3 \ S3Client;' используйте 'require '/ path /to/aws-autoloader.php '; ' – Erik

+0

Это ясно, но где я должен был поместить в свой проект? У меня есть собственный фреймворк, я помещаю его в корневую папку? или папка администратора, возможно? Какая разница, если они есть – NineCattoRules

1

Намного проще и прозрачен для вашей установки приложения просто смонтировать s3 раздел с s3fs

https://github.com/s3fs-fuse/s3fs-fuse

(Используйте параметр allow_other) Your s3fs ведет себя как обычная папка будет просто переместить файл в эту папку. S3fs затем загружает

S3fs очень надежны в последнее время строит

Вы можете прочитать изображения так же, но теряют какой-либо эффект, что AWS CDN имеет, хотя последний раз, когда я попробовал это не огромная разница

вам нужен s3fspassword файл

в формате accessKeyId: secretAccessKey

он может находиться в одном из этих мест

using the passwd_file command line option 
setting the AWSACCESSKEYID and AWSSECRETACCESSKEY environment variables 
using a .passwd-s3fs file in your home directory 
using the system-wide /etc/passwd-s3fs file 

Файл необходимо 600 разрешений

https://github.com/s3fs-fuse/s3fs-fuse/wiki/Fuse-Over-Amazon

Имеет некоторую информацию.

Когда это полная команда s3fs bucket_name mnt_dir

вы можете найти ключи здесь

https://console.aws.amazon.com/iam/home?#security_credential

из примера о я бы предположить, ваш mnt_dir бы /uploads/fufu

так s3fs bucket /uploads/fufu

г Второй проблема

s3fs -o nonempty allow_other My_S3bucket /uploads/fufu 

неправильно, вам нужно указать -o снова

s3fs -o nonempty -o allow_other My_S3bucket /uploads/fufu 

пользователя монтирование, как должны быть в плавкой группе

sudo usermod -a -G fuse your_user 

или Суд addgroup Предохранитель your_user

+0

Спасибо, так в основном используя этот способ, я не могу использовать Cloudfront как CDN? Я активировал Cloudfront и для начала я поместил свое ведро – NineCattoRules

+1

Если единственное изменение, которое вы делаете, это использование s3fs, тогда да, вы можете записать изображение в s3 с помощью s3fs, а затем использовать ссылки Cloudfront с API. Но мне нужны изменения кода – exussum

+0

Я обновил свой вопрос, не могли бы вы проверить его? – NineCattoRules

Смежные вопросы