2016-06-30 97 views
7

Sono in grado di caricare un file su un endpoint API utilizzando Postman.Carica file utilizzando Guzzle 6 all'endpoint API

Sto cercando di tradurlo in caricamento di un file da un modulo, caricarlo utilizzando laravel e la pubblicazione per l'endpoint utilizzando Guzzle 6.

Schermata di come appare in Postman (ho volutamente lasciato fuori l'URL POST) enter image description here

di seguito è il testo che genera quando si fa clic sul collegamento "genera codice" in pOSTINO:

POST /api/file-submissions HTTP/1.1 
Host: strippedhostname.com 
Authorization: Basic 340r9iu34ontoeioir 
Cache-Control: no-cache 
Postman-Token: 6e0c3123-c07c-ce54-8ba1-0a1a402b53f1 
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW 

----WebKitFormBoundary7MA4YWxkTrZu0gW 
Content-Disposition: form-data; name="FileContents"; filename="" 
Content-Type: 


----WebKitFormBoundary7MA4YWxkTrZu0gW 
Content-Disposition: form-data; name="FileInfo" 

{ "name": "_aaaa.txt", "clientNumber": "102425", "type": "Writeoff" } 
----WebKitFormBoundary7MA4YWxkTrZu0gW 

Qui di seguito è la funzione di controllo per il salvataggio del file e altre informazioni . Il file si carica correttamente, sono in grado di ottenere le informazioni sul file.

Penso che il problema che sto avendo sta impostando l'array multipart e headers con i dati corretti.

public function fileUploadPost(Request $request) 
{ 
    $data_posted = $request->input(); 
    $endpoint = "/file-submissions"; 
    $response = array(); 
    $file = $request->file('filename'); 
    $name = time() . '_' . $file->getClientOriginalName(); 
    $path = base_path() .'/public_html/documents/'; 

    $resource = fopen($file,"r") or die("File upload Problems"); 

    $file->move($path, $name); 

    // { "name": "test_upload.txt", "clientNumber": "102425", "type": "Writeoff" } 
    $fileinfo = array(
     'name'   => $name, 
     'clientNumber' => "102425", 
     'type'   => 'Writeoff', 
    ); 

    $client = new \GuzzleHttp\Client(); 

    $res = $client->request('POST', $this->base_api . $endpoint, [ 
     'auth' => [env('API_USERNAME'), env('API_PASSWORD')], 
     'multipart' => [ 
      [ 
       'name' => $name, 
       'FileContents' => fopen($path . $name, 'r'), 
       'contents'  => fopen($path . $name, 'r'), 
       'FileInfo'  => json_encode($fileinfo), 
       'headers'  => [ 
        'Content-Type' => 'text/plain', 
        'Content-Disposition' => 'form-data; name="FileContents"; filename="'. $name .'"', 
       ], 
       // 'contents' => $resource, 
      ] 
     ], 
    ]); 

    if($res->getStatusCode() != 200) exit("Something happened, could not retrieve data"); 

    $response = json_decode($res->getBody()); 

    var_dump($response); 
    exit(); 
} 

L'errore che sto ricevendo, screenshot di come viene visualizzato utilizzando la vista di debug di laravel:

enter image description here

risposta

14

Il modo in cui stai scrivendo i dati è sbagliato, quindi ha ricevuto i dati non è valido.

Guzzle docs:

Il valore di multipart è un array di array associativi, ogni contenente le seguenti coppie di valori fondamentali:

name: nome (stringa, obbligatorio) il campo modulo

contents: (StreamInterface/resource/string, richiesto) I dati da utilizzare nell'elemento di modulo .

headers: (matrice) Array associativo facoltativo di intestazioni personalizzate da utilizzare con l'elemento del modulo.

filename: (stringa) facoltativa stringa da inviare come nome file nella parte.

L'utilizzo di chiavi dall'elenco precedente e l'impostazione di intestazioni non necessarie senza separare ciascun campo in un array comporterà una richiesta errata.

$res = $client->request('POST', $this->base_api . $endpoint, [ 
    'auth'  => [ env('API_USERNAME'), env('API_PASSWORD') ], 
    'multipart' => [ 
     [ 
      'name'  => 'FileContents', 
      'contents' => file_get_contents($path . $name), 
      'filename' => $name 
     ], 
     [ 
      'name'  => 'FileInfo', 
      'contents' => json_encode($fileinfo) 
     ] 
    ], 
]);