Переписать локон с помощью Guzzle (Загрузка файла) - PHP - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь загрузить файл на свой сервер, а затем отправить его в 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 Ответ

0 голосов
/ 24 августа 2018

Это может быть в порядке, чтобы использовать 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);
...