2016-05-25 8 views
5

Ho bisogno di caricare file tramite Rest e di inviare anche qualche configurazione con esso.HTTPful attach file e json-body in una richiesta

Ecco il mio codice di esempio:

$this->login(); 
$files = array('file'=>'aTest1.jpg'); 
$data = 
    array(
     'name'=>'first file', 
     'description'=>'first file description', 
     'author'=>'test user' 
    ); 
$response = Request::post($this->getRoute('test')) 
    ->addHeader('Authorization', "Bearer " . $this->getToken()) 
    ->attach($files) 
    ->body(json_encode($data)) 
    ->sendsJson() 
    ->send(); 

Sono in grado di inviare il file o in grado di inviare il corpo. Ma non funziona se provo con entrambi ...

Qualche suggerimento per me?

saluti n00n

+0

Sto avendo lo stesso identico problema. Hai mai capito come farlo? – jjwdesign

+0

Non utilizzare attacco e corpo. Ho scoperto che si eliminerà l'altro. Invece, usa semplicemente il metodo body(). Usa file_get_contents() per ottenere dati binari per il tuo file, quindi base64_encode() quei dati e inserirli nei dati $ come parametro. Dovrebbe funzionare con JSON. L'approccio ha funzionato per me con il tipo mime application/x-www-form-urlencoded. – jjwdesign

risposta

4

Per chi arriva a questa pagina tramite Google. Ecco un approccio che ha funzionato per me.

Non utilizzare attach() e body() insieme. Ho scoperto che si eliminerà l'altro. Invece, usa semplicemente il metodo body(). Usa file_get_contents() per ottenere dati binari per il tuo file, quindi base64_encode() quei dati e inserirli nei dati $ come parametro.

Dovrebbe funzionare con JSON. L'approccio ha funzionato per me con il tipo mime application/x-www-form-urlencoded, usando $ req-> body (http_build_query ($ data)) ;.

$this->login(); 
$filepath = 'aTest1.jpg'; 
$data = 
    array(
     'name'=>'first file', 
     'description'=>'first file description', 
     'author'=>'test user' 
    ); 
$req = Request::post($this->getRoute('test')) 
    ->addHeader('Authorization', "Bearer " . $this->getToken()); 

if (!empty($filepath) && file_exists($filepath)) { 
    $filedata = file_get_contents($filepath); 
    $data['file'] = base64_encode($filedata); 
} 

$response = $req 
    ->body(json_encode($data)) 
    ->sendsJson(); 
    ->send(); 
3

il metodo body() cancella payload contenuti, così dopo aver chiamato attach(), è necessario compilare payload te stesso:

$request = Request::post($this->getRoute('test')) 
    ->addHeader('Authorization', "Bearer " . $this->getToken()) 
    ->attach($files); 
foreach ($parameters as $key => $value) { 
    $request->payload[$key] = $value; 
} 
$response = $request 
    ->sendsJson(); 
    ->send(); 
Problemi correlati