2016-05-25 1 views
5

Мне нужно загрузить файлы через Rest, а также отправить с ним некоторую конфигурацию.HTTPful attach file и json-body в одном запросе

Вот мой пример кода:

$this->login(); 
$files = array('file'=>'aTest1.jpg'); 
$data = 
    array(
     'name'=>'first file', 
     'description'=>'first file description', 
     'author'=>'test user' 
    ); 
$response = Request::post($this->getRoute('test')) 
    ->addHeader('Authorization', "Bearer " . $this->getToken()) 
    ->attach($files) 
    ->body(json_encode($data)) 
    ->sendsJson() 
    ->send(); 

Я могу отправить файл или в состоянии отправить тело. Но это не работает, если я попытаюсь с обоими ...

Любой Подсказка для меня?

С уважением n00n

+0

Я, имеющий ту же самую проблему. Вы когда-нибудь выяснили, как это сделать? – jjwdesign

+0

Не используйте приставку и корпус. Я обнаружил, что один прояснит другой. Вместо этого просто используйте метод body(). Используйте file_get_contents(), чтобы получить двоичные данные для вашего файла, а затем base64_encode() эти данные и поместить их в $ data в качестве параметра. Он должен работать с JSON. Подход работал для меня с типом mime application/x-www-form-urlencoded. – jjwdesign

ответ

4

Для тех, кто прибывает на эту страницу с помощью Google. Вот такой подход, который сработал для меня.

Не используйте attach() и корпус() вместе. Я обнаружил, что один прояснит другой. Вместо этого просто используйте метод body(). Используйте file_get_contents(), чтобы получить двоичные данные для вашего файла, а затем base64_encode() эти данные и поместить их в $ data в качестве параметра.

Он должен работать с JSON. Подход работал для меня с типом mime application/x-www-form-urlencoded, используя $ req-> body (http_build_query ($ data)) ;.

$this->login(); 
$filepath = 'aTest1.jpg'; 
$data = 
    array(
     'name'=>'first file', 
     'description'=>'first file description', 
     'author'=>'test user' 
    ); 
$req = Request::post($this->getRoute('test')) 
    ->addHeader('Authorization', "Bearer " . $this->getToken()); 

if (!empty($filepath) && file_exists($filepath)) { 
    $filedata = file_get_contents($filepath); 
    $data['file'] = base64_encode($filedata); 
} 

$response = $req 
    ->body(json_encode($data)) 
    ->sendsJson(); 
    ->send(); 
3

метод body() стирает payload содержание, поэтому после вызова attach(), вы должны заполнить payload себя:

$request = Request::post($this->getRoute('test')) 
    ->addHeader('Authorization', "Bearer " . $this->getToken()) 
    ->attach($files); 
foreach ($parameters as $key => $value) { 
    $request->payload[$key] = $value; 
} 
$response = $request 
    ->sendsJson(); 
    ->send();