Maison  >  Article  >  développement back-end  >  Que dois-je faire s'il y a une erreur lors du téléchargement du fichier curl dans php7 ?

Que dois-je faire s'il y a une erreur lors du téléchargement du fichier curl dans php7 ?

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-08-13 09:20:282661parcourir

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.

Que dois-je faire s'il y a une erreur lors du téléchargement du fichier curl dans php7 ?

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

Il 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

Nous seuls pouvons honnêtement utiliser CurlFile pour le gérer

$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-data

2. 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 CurlFile

Nous 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);

Juste comme il faut. Quand j'ai pensé pouvoir m'en débarrasser, une erreur de syntaxe de notification est apparue dans php7 :

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ètement

Continuer à 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);

Le matériel a finalement été téléchargé avec succès

J'ai levé les yeux et j'ai vu qu'il faisait déjà nuit

J'étais si heureux que je me suis rapidement essuyé le nez et j'ai emballé mes affaires pour sortir du travail

Apprentissage recommandé :

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer