Jump to content
I-NOZex

Aceder a pasta comum de uploads

Recommended Posts

I-NOZex

Boa tarde,

tenho um projecto que usa a framework php YII juntamente com o YiiBooster/Boilerplate ( http://yiibooster.clevertech.biz/ )

o projecto fica extruturado da seguinte forma:

[app_root]

-backend (area de admin)

-common (bibliotecas e extensoes comuns)

-frontend (area frontal do site)

ora, eu pretento fazer um "remote upload" na backend,e até ai tudo bem

o meu problema é que queria ter uma pasta partilhada para os uploads, na [app_root] (digamos a pasta public_html)

eu consigo fazer upload e ate guardar o link da imagem para a base de dados, mas uma vez que trabalho localmente (win7 32bits + easy php 13.1 V9), ao usar este codigo para gerar o caminho da pasta:

realpath(Yii::getPathOfAlias('application').'/../assets/img/')

ele gera um caminho do tipo: C:\Programaxao\EasyPHP\data\localweb\livetugayii\assets\img ... (para informação, Yii::getPathOfAlias('webroot') obtem o caminho da pasta backend)

e como é obvio, ao tentar carregar a imagem pelo endereço na base de dados, ele tenta carregar:

C:\Programaxao\EasyPHP\data\localweb\livetugayii\assets\img\imagem.jpg

e nao dá... creio que o problema será só localmente... mas nao tou a ver como resolver...

vi a falar algo sobre isto: http://php.net/manual/en/function.symlink.php mas não entendi muito bem o seu uso, e nao sei se funcionará tanto localmente como num servidor linux...

Não creio que isto seja problema ao nivel da framework, por isso se nao conhecerem não se preocupem, qualquer outra boilerplate do genero iria gerar um problema igual

Obrigado desde já :thumbsup:


B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
I-NOZex

mais uma peqena informação: tou a usar virtualhosts

do qual: admin.nomedosite.com vai para a backend e o nomedosite.com vai para a frontend

Edited by I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
brunoais

Se fosse sem o Yii sei fazer. Agora com o Yii não sei o que há de diferente.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
I-NOZex

nao ligues ao facto de usar framework

dame a tua sugestão se fosse em php puro, ate pode ser que solucione, no entanto eu arranjo alternativa de tendo essa base transformar para YII

é que tou mesmo as cegas, uma luz qualquer era otimo!


B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
Devexz

podes mostrar a parte do código em que fazes o upload?

E possivelmente a framework deve ter uma pasta própria para imagens, porque não fazes assim?

/img - pasta "default" da framework

- uploads - lá dentro crias uma pasta.


Contador de calorias: caloriaspordia.com

Share this post


Link to post
Share on other sites
Knitter

Não guardes o caminho completo, guarda apenas o nome da imagem, e usa um URL construído depois por ti.

Por exemplo, ao fazer uploads envio os dados para a pasta <public>/uploads, onde <public> é a raiz do endereço ou pasta pública acessível pelo browser. Claro que o realpath me vai dar algo como /home/<username>/<public>/uploads, mas em vez de guardar esse caminho, se guardar apenas o nome da imagem, posso pegar no URL do site a acrescentar o que preciso, o Yii tem formas de te dar o endereço do site, como usar a propriedade Yii::app()->baseUrl.

Resumindo, Yii::app()->baseUrl . "/uploads" . <nome da imagem> dá-te um URL que podes usar no browser para aceder à imagem.

É isto ou percebi mal a pergunta?

  • Vote 1

Share this post


Link to post
Share on other sites
I-NOZex

@Knitter, o problema é um pouco mais complexo que isso... a backend é um subdominio, que aponta para a pasta: backend > www

o basePath vai darme o path da pasta backend, o baseUrl vai darme o endereço (www.admin.site.com), ao fazer Yii::app()->baseUrl . "/uploads", ele vai procurar pela pasta uploads dentro da pasta www...

@Devexz, nao existe nenhuma pasta predefinida para uploads, apenas uma pasta common que tem as classes e assim. E eu queria uma pasta como a common para as imagens, dando para aceder na frontend como na backend...

O codigo de upload acho irrelevante, mas deixo aqui a mesma:

  $path = Yii::getPathOfAlias('webroot').'/../../uploads';
  $url = 'http://imdb-poster.b0.upaiyun.com/000/065/126.jpg!cover?_upt=eb81c7301379481672';
  $data = Yii::app()->curl->setOptions(array(
  CURLOPT_URL => $url,
  CURLOPT_RETURNTRANSFER => 1,
  CURLOPT_TIMEOUT => 30,
  ))->get($url);
  $parse = parse_url($url);
  $ext = pathinfo(basename($parse['path']),  PATHINFO_EXTENSION);
  $ext = explode('!', $ext,2);
  $filename = time() . "." . $ext[0];
  file_put_contents($path.$filename, $data);
  //return $filename;

eu ja pensei em varias soluçoes, a unica que por agora consigo ver é tornar essa pasta de uploads num subdominio... vi falar em symlinks entre a pasta na backend e na frontend mas nem entendi bem o uso da função

entretanto fico a espera do @brunoais, como disse ter uma solução...

Edited by I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
I-NOZex

aqui está uma potencial solução:

$aliasPath = realpath(Yii::getPathOfAlias('application').'/../uploads/img/'); //obtem o caminho da pasta de uploads
$imageUrl = Yii::app()->getAssetManager()->publish($aliasPath); //publica as imagens da pasta como sendo asset
CHtml::Image($imageUrl.'/1379601488.jpg','Client',array('width'=>'240')); //helper que renderiza a imagem


B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
Knitter

Existem várias alternativas, o problema não tem nada de complexo, a única coisa que é preciso é que cada componente saiba o URL a criar, e dado que és tu que o estás a fazer então podes até colocar o URL como uma opção de configuração (por exemplo usando o array params).

A opção que colocaste é uma forma, symlinks seria a minha opção se o host for GNU Linux (os symlinks não funcionam em MS Windows), ou então simplesmente ter o URL configurado, nem que o cries dinamicamente.

  • Vote 1

Share this post


Link to post
Share on other sites
I-NOZex

e qual será a opção mais correcta?

essa dos assets funciona, mas vai tar a publicar todas as imagens desnecessariamente, temo que isso possa comprometer um pouco a performance se forem muitas imagens...


B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
Knitter

Pessoalmente prefiro ser eu a controlar o URL através de opções de configuração, é mais simples quando quero mudar mas obriga a escrever mais código. Usar o sistema de publicação de assets é mais simples a nível de código, e também é portável o suficiente.

O mecanismo de publicação de assets faz uma validação simples para ver se já publicou o ficheiro ou a pasta e assim evitar copiar os mesmos ficheiros várias vezes, isso ajuda na performance. Atenção que esta validação é muito simples, usa hashes muito pequenas (com mais colisões) e, se não me engano, valida apenas o nome da pasta se tentares publicar uma pasta completa e não considera alterações ao conteúdo da pasta, os assets são considerados imutáveis com alterações apenas em ugrades.

Share this post


Link to post
Share on other sites
I-NOZex

uhm pois, apesar de resolver, nao achei que fosse totalmente viavel...

e o problema começa um pouco antes disto tudo ate, pq a backend e a frontend funciona quase como 2 sites separados... a forma que vi de os separar num endereço, foi tornado a backend um subdominio e a frontend ser um dominio principal... mas depois gera aqui este problema... como é que tu resolverias?

ja procurei alguns artigos do genero, mas nada que funcione mesmo... vejo muitos tutorias de como fazer upload de ficheiros do pc para o servidor, mas um upload remoto (que é apenas a copia de um servidor para outro) nao encontro nada... tou a baralhar-me cada vez mais xD se me puderes elucidar com um pouco de codigo... aquele que disseste la atras funcionaria, se a pasta tivesse dentro da backend...


B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.