Newsgroup: it.comp.www.php
Titolo: Zend e cartelle protette al di fuori della struttura

Salve a tutti,
	nel sito web che sto sviluppando con Zend 1.11 ho la necessità di 
inserire una cartella contenente files per esempio degli utenti che non 
deve essere nella cartella public di zend ma esterna per dare un minimo 
di sicurezza in più. Come faccio a dire a zend che se richiedo il file 
che si trova in
"/var/www/otherfiles/users/usrpippo/foto.jpg"
 
deve essere visto da zend con un path tipo
"
http://www.miosito.it/mycontroller/myaction/user/usrpippo/file/foto.jpg
" ???
 
Mi sapete dire voi come gestite queste cartelle "private" o "riservate"?
 
Grazie!

 "
http://www.miosito.it/mycontroller/myaction/user/usrpippo/file/foto.jpg
" ???
 
All'interno del controller "mycontroller" e piu' precisamente nella 
action "myaction" predisponi del codice che verifica l'esistenza
dell'utente "usrpippo" e l'esistenza del file "foto.jpg", quindi fai
del file quello che vuoi.
 
Esempio:
 
public function myAction() {
  $userId = $this->_getParam('user', false);
  $fileName = $this->_getParam('file', false);
 
  // controlli che l'utente esiste e non sia una invenzione
  // del browser - una query ad un DB for example ? :P
  if(false != $fileName):
    throw new Zend_Exception('Invalid UserId');
  endif;
 
  if($userId la la la):
 
  endif;
 
  // controlli che il file esiste e non sia una invenzione
  // del browser - con le filesystem function for example ? :P
  if(false != $fileName):
    throw new Zend_Exception('Invalid Filename');
  endif;
 
  if(file_exists("/var/www/otherfiles/users/{$userId}/{$fileName}")):
    // file esiste ora fai quello che vuoi
  else:
    throw new Zend_Exception('File not found');
  endif;
 
  ...
}
 
Naturalmente, ti esorto a constatare che la porzione di codice
qui sopra riportata e' volutamente ridotta all'osso e quindi solo
esempilificativa. A buon intenditor poche parole :)
 
Giuseppe

 ???
 
Il problema sono le barre nell'url, che vengono spezzate da ZF in 
parametro/valore/parametro/valore/...
 
Puoi usare una route personalizzata nel bootstrap:
 
$router = Zend_Controller_Front::getInstance()->getRouter();
$router->addRoute("fileprivati",
  new Zend_Controller_Router_Route("usrfile/:file",
   array(
    "module" => "iltuomodulo",
    "controller" => "iltuocontroller",
    "action" => "latuaaction"
   )
  )
);
 
Nella tua action ti trovi 
 
$file = $this->_request->getParam('file');
 
che contiene il primo parametro. Come dicevo, il problema sono le barre 
che ti spezzano i parametri. Dovresti ricostruirti a mano il path al 
file, se non usi un identificativo.
 
Bye.

    endif;
 
Il problema è proprio qui!
 
se io voglio linkare il file in un "<a href" mi comparirà tutto il path 
che tra l'altro non è nel path del sito e quindi probabilmente non 
raggiungibile a meno di non fare modifiche del caso o nella virtualhost 
di Apache o nell'application.ini di Zend.

 che tra l'altro non è nel path del sito e quindi probabilmente non
 
Se devi fare un download da una directory protetta, probabilmente la 
soluzione migliore e' usare il modulo di apache xsendfile: 
https://tn123.org/mod_xsendfile/
 
 
Ciao.
 
-- 
Pubblicita' regresso: 
http://www.ferrero.org
 
** Per scrivermi in mail, sostituire nutella con ferrero...
** To contact me by email, change nutella to ferrero...
 
 
 

 di Apache o nell'application.ini di Zend.
 
Vera ma tu in href anzichè linkare il file colleghi la famosa 
myAction. Quindi ripartendo dal famoso spezzone di esempio se 
tutte le verifiche sono andate a buon fine e il file esiste:
 
// definisci il content disposition - attachment o inline ?
$contentDisposition = 'attachment';
 
// assumiamo per esempio che il file sia un pdf
$mimeType = 'application/pdf';
 
// spedisci il file al browser
$content = file_get_contents(
   "/var/www/otherfiles/users/{$userId}/{$fileName}"
);
 
$response = $this->getResponse();
$response->setHeader('Cache-Control', 'public', true)
         ->setHeader('Content-Description', 'File Transfer', true)
         ->setHeader('Content-Type', "{$mimeType}", true) 
         ->setHeader('Content-Disposition', 
           "{$contentDisposition};filename={$fileName}", true);
 
$response->setBody($content);
 
$response->sendResponse();
 
In questa maniera il path rimane nascosto all'utente,
e tu puoi facilmente definire quali file inviare e quali
no.
 
btw, non ho provato ma dovrebbe funzionare.
 
Saluti
Giuseppe

> btw, non ho provato ma dovrebbe funzionare.
 
Provo e poi scrivo se funziona!