Это правильный способ создания и публикации данных формы mutipart в CakePhp3? - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь опубликовать данные формы mutipart в CakePhp3 .Форма должна содержать немного информации о пользователе (текстовые поля) и изображение.

Я делаю что-то вроде этого:

$request = [
  'fistname'=>$user->firstname,
  'lastname'=>'$user->lastname',
  '_session'=>'$session'
];

$form = new FormData();
foreach ($request as $key => $value) {
  $form->add($key,$request);
}
$file = $form->addFile('upload',fopen(WWW_ROOT.'img/picture.png','r'));
$file->contentId('mypicture'); // <-- not sure what this is
$file->disposition('attachment');

$response = $http->post(
  $url,
  (string)$form,
  ['headers' => ['Content-Type' => $form->contentType()]]
);

Это правильный способ создания и публикацииданные формы mutipart в CakePhp3?

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ

Если я отправляю сообщение на свой собственный сервер, оно, кажется, работает (спасибо @Mary), но яполучить реплицированное имя и фамилию (это может быть проблемой):

object(Cake\Http\ServerRequest) {
trustProxy => false
...
[protected] data => [
    'fistname' => [
        'fistname' => 'Test',
        'lastname' => 'Test'
    ],
    'lastname' => [
        'fistname' => 'Test',
        'lastname' => 'Test'
    ],
    'upload' => [
        'tmp_name' => '/private/var/folders/g5/jjd1vc557bs21hq805lcxjk80000gn/T/phpAVXNqK',
        'error' => (int) 0,
        'name' => 'SELL5BAE2B6348272_gallery_1.png',
        'type' => 'image/png',
        'size' => (int) 200231
    ]
]
...

Если я отправлю сообщение на сервер API, это не будет работать.Я сделал то же самое с CURL, и он работает:

$filename = WWW_ROOT.'ufiles/medium/'.$img['image_1'];
$cFile = curl_file_create($filename);
$request = [
  '_operation'=>'uploadFile',
  'id'=>$ticket_id,
  '_session'=>$session,
  'file' => $cFile
];

try{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  curl_setopt($ch, CURLOPT_URL,$this->crm['endpoint']);
  curl_setopt($ch, CURLOPT_POST,1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
  $response=curl_exec($ch);
  curl_close ($ch);
}catch(\Exception $e){
  $response = null;
}

1 Ответ

0 голосов
/ 28 сентября 2018

Встречный вопрос: работает ли он?

Как вы можете видеть здесь, $file->contentId() устанавливает идентификатор содержимого или часть в теле запроса данных из нескольких частей:
https://github.com/cakephp/cakephp/blob/master/src/Http/Client/FormDataPart.php#L114

Я не уверен в этом, но я не думаю, что вы должны установить его, поскольку он не требуется для multipart/form-data:
https://www.w3.org/TR/2006/REC-xforms-20060314/slice11.html#serialize-form-data


Edit
Я провел некоторое тестирование и: Это.работает.Вот что я попробовал:

use Cake\Http\Client;
use Cake\Http\Client\FormData;

public function test() {

    $request = [
        'fistname'=>'Test',
        'lastname'=>'Test'
    ];

    $form = new FormData();
    $http = new Client();

    foreach ($request as $key => $value) {
        $form->add($key,$request);
    }
    $file = $form->addFile('upload',fopen(WWW_ROOT.'img/awards.png','r'));
    $file->contentId('mypicture'); // <-- not sure what this is
    $file->disposition('attachment');

    $response = $http->post(
      'http://www.testurl.dev/test',
      (string)$form,
      ['headers' => ['Content-Type' => $form->contentType()]]
    );
    var_dump($response);
    exit;
}

Вывод var_dump($response):

object(Cake\Http\Client\Response)#150 (12) {
  ["code":protected]=>int(200)
  …
  ["headers":protected]=>array(12) {
    ["Date"]=>array(1) {
      [0]=>string(29) "Fri, 28 Sep 2018 12:44:31 GMT"
    }
    …
  }
}

Вывод журнала доступа к серверу:

[28/Sep/2018:14:44:31 +0200] "POST /test HTTP/1.1" 200 6852 "-" "CakePHP"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...