Я могу загрузить файл в конечную точку API, используя Postman.
Я пытаюсь перевести это на загрузку файла из формы, загружая его с помощью Laravel и отправляя на конечную точку с помощью Guzzle 6.
Снимок экрана о том, как он выглядит в Postman (я специально упустил URL-адрес POST)
Ниже приведен текст, который он генерирует, когда вы нажимаете ссылку «Создать код» в POSTMAN:
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
Ниже приведена функция контроллера для сохранения файла и другой информации. Файл загружается правильно, я могу получить информацию о файле.
Я думаю, что проблема заключается в настройке массива multipart и headers с правильными данными.
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(); }
Ошибка, которую я получаю, снимок экрана о том, как он отображается с использованием отладочного представления Laravel:
То, как вы отправляете данные POST, ошибочно, поэтому полученные данные неверны.
Документы Guzzle :
Значение
multipart
– это массив ассоциативных массивов, каждый из которых содержит следующие пары ключей:
name
: (string, required) имя поля формы
contents
: (StreamInterface / resource / string, required) Данные для использования в элементе формы.
headers
: (array) Необязательный ассоциативный массив пользовательских заголовков для использования с элементом формы.
filename
: (string) Необязательная строка для отправки в качестве имени файла в части.
Использование ключей из приведенного выше списка и установка ненужных заголовков без разделения каждого поля на один массив приведет к созданию плохого запроса.
$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) ] ], ]);