Переписать локон с помощью 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.

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

1 ответ

Решение

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

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

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

использование body передать необработанное тело и выдать идентичный запрос вашему curl с жадностью:

$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);
Другие вопросы по тегам