Maison > développement back-end > PHP7 > 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 ?

醉折花枝作酒筹
Libérer: 2023-02-18 07:56:01
avant
2724 Les gens l'ont consulté

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);
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion
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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal