Существует много проблем с отправкой файлов так же, как и в старых версиях библиотеки, многомерного массива, многомерного массива, содержащего файлы, CurlFile и http_build_query ().
Я считаю, что, разместив код, я помогу некоторым сэкономить время.Я проверяю множество решений и кода, и для меня работает только этот:
/**
* Complaint status list
*
* @Route("/edit/{id}", name="b2b_rma_complain_edit")
* @Route("/quardian/{id}", name="b2b_rma_complain_quardian_edit")
*
* @return string Twig tpl B2BRMA/Complaint/index.html.twig
*/
public function editAction(Request $request, $id)
{
if($request->request->get('complaint')){
$post = $request->request->all();
foreach($request->files->all() as $key => $value){
if($value){
$post[$key] = new \CurlFile($value->getRealPath(), $value->getMimeType(), $value->getClientOriginalName());
}
}
}
$post['b2b'] = $this->getParameter('medos_token');
$post['complaint_id'] = $id;
$routeName = $request->get('_route');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->getParameter('medos_url').'/edit/'.$id);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->build_post_fields($post));
$response = curl_exec($ch);
$crawler = new Crawler($response);
$html = str_replace('btn-success', 'btn-primary', $crawler->filter('#b2b-curl')->html());
return $this->render('@B2BRMA/Complaint/edit.html.twig', array('id' => $id, 'routeName' => $routeName, 'html' => preg_replace('~>\s+<~', '><', $html)));
}
public function build_post_fields($data, $existingKeys='', &$returnArray=[]){
if(($data instanceof \CURLFile) or !(is_array($data) or is_object($data))){
$returnArray[$existingKeys]=$data;
return $returnArray;
}
else{
foreach ($data as $key => $item) {
$this->build_post_fields($item,$existingKeys?$existingKeys."[$key]":$key,$returnArray);
}
return $returnArray;
}
}
Конечно, это только пример