Cet article vous présentera comment résoudre les erreurs de téléchargement de fichiers curl dans php7. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.
Récemment, lorsque le projet est connecté à l'interface de la bibliothèque de matériaux du compte public WeChat, en utilisant la méthode curl post pour soumettre des fichiers de matériaux, j'ai constaté qu'il continue de demander
{"errcode": 41005, "errmsg " : "données multimédias manquantes" }
Contenu du code
$url = self::$add_material . $accessToken . '&type=' . $key; $data = [ 'media' => '@' . $fileName, 'form-data' => $fileInfo, 'description' => json_encode([ 'title' => $fileName, 'introduction' => '' ]), ]; self::init($url); $data = is_array($data) ? http_build_query($data) : $data; curl_setopt(self::$curl, CURLOPT_POST, 1); curl_setopt(self::$curl, CURLOPT_POSTFIELDS, $data); $info = curl_exec(self::$curl); curl_close(self::$curl);
Après avoir vérifié la documentation officielle, @ n'est plus pris en charge après php5.5. Vous devez utiliser CurlFile ou définir CURLOPT_SAFE_UPLOAD sur 1
Nous seuls pouvons honnêtement utiliser CurlFile pour le gérerIl y a un problème « @ » sur Requêtes POST en plusieurs parties.
Solution pour PHP 5.5 ou version ultérieure :
Activez CURLOPT_SAFE_UPLOAD.
Utilisez CURLFile au lieu de « @ ». les téléchargements ne sont plus pris en charge par erreur
$url = self::$add_material . $accessToken . '&type=' . $key; $data = [ 'media' => new \CURLFile($fileName), 'form-data' => $fileInfo, 'description' => json_encode([ 'title' => $fileName, 'introduction' => '' ]), ]; self::init($url); $data = is_array($data) ? http_build_query($data) : $data; curl_setopt(self::$curl, CURLOPT_POST, 1); curl_setopt(self::$curl, CURLOPT_POSTFIELDS, $data); $info = curl_exec(self::$curl); curl_close(self::$curl);
Ensuite, j'ai trouvé trois gros pièges en écrivant comme celui-ci (je suis stupide)
1 Si CURLOPT_POSTFILEDS passe dans le tableau content_type. , ce sera multipart/form-data ; si CURLOPT_POSTFILEDS passe Si l'entrée est json ou key-value& content_type est x-www-form_urlencoded; mais WeChat prend en charge le tableau transmis par form-data2. dans le tableau, http_build_query le transformera en tableau
3. CurlFile ne peut lire que le chemin dans le serveur. Si vous souhaitez télécharger une adresse sur Internet, vous devez d'abord la télécharger dans le répertoire temporaire du serveur, puis lisons le chemin du fichier (chemin absolu) via CurlFileNous ajustons ensuite le code
$url = self::$add_material . $accessToken . '&type=' . $key; $data = [ 'media' => new \CURLFile($fileName), 'form-data' => $fileInfo, 'description' => json_encode([ 'title' => $fileName, 'introduction' => '' ]), ]; self::init($url); curl_setopt(self::$curl, CURLOPT_POST, 1); curl_setopt(self::$curl, CURLOPT_POSTFIELDS, $data); $info = curl_exec(self::$curl); curl_close(self::$curl);
Array to conversion de chaîne
Ensuite, j'ai vérifié les informations et j'ai découvert que CURLOPT_POSTFIEDLS ne prend pas en charge les tableaux multidimensionnels Mais l'erreur de syntaxe de l'avis a été demandée, nous pouvons le bloquer complètementContinuer à ajuster le code
$url = self::$add_material . $accessToken . '&type=' . $key; $data = [ 'media' => new \CURLFile($fileName), 'form-data' => $fileInfo, 'description' => json_encode([ 'title' => $fileName, 'introduction' => '' ]), ]; self::init($url); curl_setopt(self::$curl, CURLOPT_POST, 1); @curl_setopt(self::$curl, CURLOPT_POSTFIELDS, $data); $info = curl_exec(self::$curl); curl_close(self::$curl);
Tutoriel vidéo php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!