Как отправить все файлы из запроса библиотекой curl - PullRequest
0 голосов
/ 25 июня 2019

Мне нужно отправить все файлы из запроса Symfony в другую систему с помощью библиотеки curl.

Я создаю что-то вроде моста к старой простой системе php.Как я могу добавить файлы как переменную post?

На самом деле мне нужно только получить файлы на контроллер и пропустить тот же массив $_FILES через curl.(Следующий код является просто тестом. Я полностью осознаю, как должна выглядеть проблема безопасности. Мне нужна помощь только с правильной отправкой файлов)

        $post = '';

        if($request->request->get('complaint')){

            $post = urldecode(http_build_query($request->request->all()));
            $files = array();

            foreach($request->files->all() as $key => $value){
                // How can I add files like a post variable?
                $post .= $myFileInRightFormat;
            }

        }

        $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, 'b2b='.$this->getParameter('medos_token').'&complaint_id='.$id.'&'.$post);

        $response = curl_exec($ch);

1 Ответ

0 голосов
/ 26 июня 2019

Существует много проблем с отправкой файлов так же, как и в старых версиях библиотеки, многомерного массива, многомерного массива, содержащего файлы, 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;
        }
    }

Конечно, это только пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...