← Hosting

Amazon S3

Lida 5463 vezes

Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Halo +trafeguianos :)

Estou a tentar desenvolver um sistema que irá precisar de bastante espaço de armazenamento, o sistema é bastante simples e não ocupará muito numa conta de alojamento dita normal, no entanto deverá precisar de algum (muito) espaço de armazenamento para ficheiros a principio apenas .pdf.

Andei a ver que soluções poderiam ser equacionadas e lembrei-me do serviço da amazon, mas estou a ter algumas dificuldades e algumas dúvidas que ou não encontrei no site ou não percebi bem.

Criei a conta e criei um bucket, mas agora não faço a mínima de como acedo (via link ou ftp) ao alojamento.
A ideia é indicar no script o local onde deve guardar os ficheiros e onde deve ir buscá-los quando necessário.
Já li por aqui que devo criar um subdomínio...!? :-?

Alguém com mais experiência com este serviço que me possa ajudar??

Obrigado,
Roberto Francisco
Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

anyone!?
Offline

Bruno Mota 
Membro
Mensagens 1733 Gostos 3
Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Offline

epsy 
Membro
Mensagens 553 Gostos 1
Feedback +1

Troféus totais: 25
Trófeus: (Ver todos)
Search Windows User Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1

Não podes aceder por ftp normal (eles usam um protocolo próprio), mas "no problem", podes usar o crossftp ou o plugin do firefox (S3 Fox organizer).

Se tiveres alguma dúvida, diz.
Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

@Bruno essa parte já passei a questão agora passa por ligar o script que tenho em php que faz o upload dos ficheiros para o próprio servidor, passar a fazer para o servidor da amazon.

@epsy a minha dúvida é a que já referi, ligar o script que tenho de forma a que em vez de fazer o upload dos ficheiros para o mesmo servidor onde está, fazer para o servidor da amazon.

Já tenho o bucket criado e uma pasta, tenho andado de volta dos tutos que o eles têm no site... Falam em chaves de acesso e em politicas de acesso mas não estou a ver como é que envio os ficheiros para lá.

 Se alguém já tiver configurado algo do género ou que esteja a ver como se faz, agradecia uma mãozinha  :lol:
Offline

Bruno Mota 
Membro
Mensagens 1733 Gostos 3
Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Offline

epsy 
Membro
Mensagens 553 Gostos 1
Feedback +1

Troféus totais: 25
Trófeus: (Ver todos)
Search Windows User Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1

Podes enviar os ficheiros para lá de várias formas:

1. Instalas o plugin firefox S3 organizer e configuras com a chave de acesso e a chave segredo. ou,
2. Fazes download do crossFTP (há uma versáo gratuita), configuras para o serviço amazon S3 e indicas os dados de login ( chave de acesso e a chave segredo). ou,
3. Usas a interface web da amazon:  AWS Management Console . Dá para fazer upload, criar pastas, editar permissões, etc.


Podes associar a um (sub) domínio próprio, basta para isso que configures um "Cname Record" que aponte para o endereço: s3-external-3.amazonaws.com (se o teu serviço S3 for europeu / Irlanda).
Além disso é preciso que o aliás do registo Cname tenha o nome igual ao do teu bucket.

Quando a fazer o upload com programação, se estiveres a usar php, vê este script: http://net.tutsplus.com/tutorials/php/how-to-use-amazon-s3-php-to-dynamically-store-and-manage-files-with-ease/

A definição de permissões e políticas de acesso da aws, parece à partida um bocado estranha, mas não é nenhum bicho de 7 cabeças (tem só 5). he he
Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Bom, isto já está a ficar melhor  :-P

O tutorial da tutsplus foi um bom empurrão nas minhas dúvidas e a class está muito bem conseguida, já agora aconselho a quem tiver interesse ler também este que é a introdução ao S3.

Bom, mas continuando, já consegui aplicar o exemplo deles ao form que já tinha e consigo fazer o upload no entanto eu preciso de enviar ficheiros .pdf e não me deixa dá a mensagem:

Warning: S3::putObject(): [505] Unexpected HTTP status in G:\root\user\S3.php on line 312

Ao que me parece a mim, teria de mudar o Content type no entanto não faço ideia de como fazer isto funcionar, ficheiros .png por exemplo são enviados .pdf não.

Andei por aqui: http://undesigned.org.za/2007/10/22/amazon-s3-php-class/documentation
mas também não consegui nada.

Alguém sabe o que devo mudar?

Obrigado,
Roberto Francisco
Offline

epsy 
Membro
Mensagens 553 Gostos 1
Feedback +1

Troféus totais: 25
Trófeus: (Ver todos)
Search Windows User Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1

No código, deves ter de identificar qual o tipo de ficheiro (pela extensão, talvez) e associar  a propriedade
'content-type' => 'application/pdf'' ao objecto a enviar.


Vê aqui :
Código: (php) [Seleccione]
public static function putObjectFile($file, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $contentType = null) {
return self::putObject(S3::inputFile($file), $bucket, $uri, $acl, $metaHeaders, [b]$contentType[/b]);
}

e aqui:

Código: (php) [Seleccione]
public function putObjectString($string, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $contentType = 'text/plain') {
return self::putObject($string, $bucket, $uri, $acl, $metaHeaders, [b]$contentType[/b]);
}

Poderá ser aí.
Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Pois o meu problema é onde, porque ao que percebi ele faz a verificação do content-type, por exemplo aqui:

Código: [Seleccione]
// Content-Type
if ($contentType !== null)
$input['type'] = $contentType;
elseif (!isset($input['type']) && isset($input['file']))
$input['type'] = self::__getMimeType($input['file']);
else
$input['type'] = 'application/octet-stream';

mas já mudei para 'application/pdf' e não resultou, é porque entretanto deve haver uma das condições anteriores que se tornou verdadeira...
Bom estou perdido com esta treta!  :superlol:
Offline

epsy 
Membro
Mensagens 553 Gostos 1
Feedback +1

Troféus totais: 25
Trófeus: (Ver todos)
Search Windows User Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1

Já experimentaste, quando chamas a função: putObjectFile(,,,,) indicar explicitamente o parâmetro $contentType = 'application/pdf' ?

Atenção  a ficheiros com espaços ou caracteres latinos no nome.
Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

 :-? Dá-me erro:

Warning: S3::inputFile(): Unable to open input file: application/pdf in G:\USBWebserver v8_en\root\rep\user\S3.php on line 224

aqui a linha indicada:

Código: [Seleccione]
public static function inputFile($file, $md5sum = true) {
if (!file_exists($file) || !is_file($file) || !is_readable($file)) {
trigger_error('S3::inputFile(): Unable to open input file: '.$file, E_USER_WARNING);
return false;
}
return array('file' => $file, 'size' => filesize($file),
'md5sum' => $md5sum !== false ? (is_string($md5sum) ? $md5sum :
base64_encode(md5_file($file, true))) : '');
}

EDIT:

Coloquei assim:

Código: [Seleccione]
if ($s3->putObjectFile($contentType = 'application/pdf', $file_tmp_name, "invoicebucket", $file, S3::ACL_PUBLIC_READ)) {
echo "<strong>We successfully uploaded your file.</strong>";
Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Atenção  a ficheiros com espaços ou caracteres latinos no nome.

O nome dos ficheiros são todos convertidos com md5...
Offline

asturmas 
Administrador
Mensagens 19734 Gostos 50
Feedback +2

Troféus totais: 39
Trófeus: (Ver todos)
Mobile User Windows User Super Combination Combination Topic Starter 100 Poll Votes 50 Poll Votes 10 Poll Votes Poll Voter Poll Starter

Uma sugestão... Um servidor barato internacional lowcost não te saia muito mais barato e era muito mais simples para alojamento básico de ficheiros?
Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

hum... não sei, tens alguma sugestão?