30

Postman を使用してファイルを API エンドポイントにアップロードできます。

私はそれをフォームからファイルをアップロードし、Laravel を使用してアップロードし、Guzzle 6 を使用してエンドポイントに投稿することに変換しようとしています。

Postman での表示のスクリーンショット (意図的に POST URL を省略しました) ここに画像の説明を入力

以下は、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

以下は、ファイルやその他の情報を保存するためのコントローラー関数です。ファイルは正しくアップロードされ、ファイル情報を取得できます。

私が抱えている問題は、マルチパートとヘッダーの配列を正しいデータで設定することだと思います。

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のデバッグビューを使用してどのように表示されるかのスクリーンショット:

ここに画像の説明を入力

4

3 に答える 3

70

データを POST する方法が間違っているため、受信したデータの形式が正しくありません。

ガズルのドキュメント:

の値はmultipart連想配列の配列で、それぞれに次のキーと値のペアが含まれています。

name: (文字列、必須) フォーム フィールド名

contents:(StreamInterface/resource/string、必須) フォーム要素で使用するデータ。

headers: (配列) フォーム要素で使用するカスタム ヘッダーのオプションの連想配列。

filename: (文字列) パーツのファイル名として送信するオプションの文字列。

上記のリストにないキーを使用し、各フィールドを 1 つの配列に分割せずに不要なヘッダーを設定すると、不適切なリクエストが行われます。

$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)
        ]
    ],
]);
于 2016-07-11T13:12:17.960 に答える