Переписать curl с помощью Guzzle (загрузка файла) — PHP

Я пытаюсь загрузить файл на свой сервер, а затем отправить этот файл в Zendesk. В документации Zendesk показано, как:

curl "https://{subdomain}.zendesk.com/api/v2/uploads.json?filename=myfile.dat&token={optional_token}" \
  -v -u {email_address}:{password} \
  -H "Content-Type: application/binary" \
  --data-binary @file.dat -X POST

Это прекрасно работает. Теперь мне нужно переписать это с помощью Guzzle (версия 6). Я использую Symfony 2.7:

$file = $request->files->get('file');

$urlAttachments = $this->params['base_url']."/api/v2/uploads.json?filename=".$file->getClientOriginalName();

$body = [
        'auth' => [$this->params['user'], $this->params['pass']],
        'multipart' => [
        [
            'name'     => $archivo->getClientOriginalName(),
            'contents' => fopen($file->getRealPath(), "r"),
        ],
    ]
];

$client = new \GuzzleHttp\Client();
$response = $client->request('POST', $urlAttachments, $body);
$response = json_decode($response->getBody(), true);

Файл загружается, но когда я его загружаю, он также получает некоторые метаданные в своем содержимом (нарушая некоторые другие типы файлов). Думаю, я не загружаю его правильно, так как другой способ с завитками работает нормально.

--5b8003c370f19
Content-Disposition: form-data; name="test.txt"; filename="php6wiix1"
Content-Length: 1040

... The rest of the original content of the test file...

--5b8003c370f19--

Я не знаю, почему эти данные также отправляются как часть файла (чего я не хочу), и можно ли использовать для этого multipart.

Спасибо за любую помощь!


person monstercode    schedule 24.08.2018    source источник


Ответы (1)


может использовать multipart, но сервер должен обрабатывать его правильно. Это другое тело запроса, используете вы его или нет.

Он часто используется в HTML-формах с (множественной) загрузкой файлов. Файлы имеют имена (таким образом, метаинформация), поэтому файлов может быть несколько. В файлах также могут быть поля обычной формы (текст). Вы, вероятно, можете найти лучшее объяснение этого выполнив поиск, просто хотел дать краткое объяснение.

И кажется, что в вашем случае сервер не обрабатывает данные составной формы иначе, чем «двоичный пост», поэтому он сохраняет все это, включая метаинформацию.

Используйте body, чтобы передать необработанное тело и создать идентичный запрос. к вашему curl с помощью Guzzle:

$urlAttachments = $this->params['base_url']."/api/v2/uploads.json?filename=".$file->getClientOriginalName();

$opts = [
    // auth
    'body' => fopen($file->getRealPath(), "r"),
    'headers' => ['Content-Type' => 'application/binary'],
];

$client = new \GuzzleHttp\Client();
$response = $client->request('POST', $urlAttachments, $opts);
person Tobias K.    schedule 24.08.2018
comment
Большой!! Это сработало!! Мне также пришлось увеличить размер загрузки для nginx и php-fpm. Спасибо!! - person monstercode; 27.08.2018