2013-07-12 6 views
5

Sto provando a caricare un file su endpoint di terze parti, ma non posso inviare il file direttamente dal mio modulo perché l'API richiede un api_key che posso ' t esporre all'utente finale. Pertanto, il mio piano era di indirizzare il modulo verso un controller/azione e postare i dati da lì. Tuttavia, quando I debug($this->request->data) dall'interno del controller, mancano i dati del file.CakePHP: dati di file pubblicati non inclusi nella richiesta-> dati

Il modulo a vista:

echo $this->Form->create('Media', array('type'=>"file", 'url'=>array('controller'=>'media', 'action'=>'upload'))); 
echo $this->Form->input('name', array("name"=>"name")); 
echo $this->Form->input('file', array('type'=>'file', "name"=>"file")); 
echo $this->Form->input('project_id', array('type'=>'hidden', "name"=>"project_id", "value"=>$project["Project"]['hashed_id'])); 
//THIS CANNOT BE HERE: echo $this->Form->input('api_password', array('type'=>'hidden', "name"=>"api_password", "value"=>'xxxxxxx')); 
echo $this->Form->end("Submit"); 

Ecco cosa quello che vedo quando mi debug() i dati di richiesta dal controller:

array(
    'name' => 'Some Name', 
    'project_id' => 'dylh360omu', 
) 

Che cosa sta succedendo qui?

+0

hai provato la stessa identica, ma non cambiando i nomi di input? – Nunser

+2

Hai provato a guardare cosa c'è in $ this-> request? 'debug ($ this-> request)' I dati del file cosa sono gestiti al di fuori dei dati della richiesta. – usumoio

+0

quanto è grande il file e può essere di tale dimensione dalle direttive upload_max_filesize e max_post_size? –

risposta

6

dati di caricamento di file può essere trovata solo in CakeRequest::data nel caso il nome elemento di input viene passato in un array chiamato data (che è l'impostazione predefinita quando non definire un nome specifico manualmente), cioè:

<input type='file' name='data[file]'> 

In il vostro caso, tuttavia, l'elemento sarà simile a questa:

<input type='file' name='file'> 

che farà sì che i dati di file da mettere in CakeRequest::params[form].

https://github.com/cakephp/cakephp/blob/2.4.0/lib/Cake/Network/CakeRequest.php#L346

Quindi, o cambiare il nome nella forma di conseguenza:

$this->Form->input('file', array('type' => 'file', 'name' => 'data[file]')); 

o accedere ai dati dei file tramite CakeRequest::params[form]:

debug($this->request->params['form']); 
+0

fantastico! Come lo scopri? – yuchaozh

+0

Osservando il codice sorgente @yuchaozh – ndm

0

Nunser aveva ragione (come sempre) ! Il problema è risultato dalla personalizzazione del nome dell'input. Quando rimuovo lo 'name'=>'...' dall'array delle opzioni, il file appare come previsto. Questo sembra un bug, ma se qualcuno ha una spiegazione migliore mi piacerebbe sentirlo.

+0

Ciao. Sono contento che funzioni ora. La risposta di ndm sembra essere la ragione del problema, però.Non è un bug come lui spiega, solo "qualcosa che accade". – Nunser

+0

Grazie. Rileggo quella risposta e hai ragione (di nuovo). – emersonthis