Quelqu'un peut-il me donner un exemple pour la classe de CURLFile de PHP?

j'avais un code PHP très simple pour télécharger un fichier sur un serveur distant; la façon dont je le faisais (comme cela a été suggéré ici dans d'autres solutions) est d'utiliser cUrl pour télécharger le fichier.

Voici mon code:

$ch = curl_init("http://www.remotesite.com/upload.php"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('fileupload' => '@'.$_FILES['Filedata']['tmp_name'])); 
echo curl_exec($ch);        

le serveur exécute PHP 5.5.0 et il apparaît que @filename a été déprécié en PHP > = 5.5.0 comme indiqué iciCURLOPT_POSTFIELDS description, et par conséquent, j'obtiens cette erreur:

Deprecated: curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in ... 

fait intéressant, il y a est absolument rien à propos de cette classe sur php.net mis à part un aperçu de base de la classe. Pas d'exemples, pas de description des méthodes ou des propriétés. En gros, c'est vide ici. Je comprends qu'il s'agit d'une toute nouvelle classe avec peu ou pas de documentation et très peu d'utilisation dans le monde réel, c'est pourquoi pratiquement rien de pertinent n'apparaît dans les recherches sur Google ou ici sur Stackoverflow sur cette classe.

je me demande s'il y a quelqu'un qui a utilisé cette classe de CURLFile et peut peut-être m'aider ou me donner un exemple pour l'utiliser à la place de @filename dans mon code.

Edit:

je voulais ajouter mon "télécharger.php " code aussi bien; ce code fonctionnerait avec la méthode traditionnelle @filename mais ne fonctionne plus avec le code de classe CURLFile:

$folder = "try/";
$path = $folder . basename( $_FILES['file']['tmp_name']); 
if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
echo "The file ".  basename( $_FILES['file']['tmp_name']). " has been uploaded";
}

Montage Final:

voulait ajouter le code Final / de travail pour d'autres à la recherche d'un exemple de travail similaire du CURLFile à peine documenté classe. ..

curl.php (serveur local)

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label> <input type="file" name="Filedata" id="Filedata" /> 
<br />
<input type="submit" name="submit" value="Submit" />
</form>

<?php
if ($_POST['submit']) {
    $uploadDir = "/uploads/";
    $RealTitleID = $_FILES['Filedata']['name'];
    $ch = curl_init("http://www.remotesite.com/upload.php"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $args['file'] = new CurlFile($_FILES['Filedata']['tmp_name'],'file/exgpd',$RealTitleID);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $args); 
    $result = curl_exec($ch);       
}
?>

télécharger.php (serveur distant)

$folder = "try/";
$path = $folder . $_FILES['file']['name']; 
if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
echo "The file ".  basename( $_FILES['file']['name']). " has been uploaded";
} 
29
demandé sur luci5r 2013-06-11 01:13:56

4 réponses

Il y a un extrait sur le RFC pour le code: https://wiki.php.net/rfc/curl-file-upload

curl_setopt($curl_handle, CURLOPT_POST, 1);
$args['file'] = new CurlFile('filename.png', 'image/png', 'filename.png');
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $args);

vous pouvez aussi utiliser la fonction apparemment inutile curl_file_create( string $filename [, string $mimetype [, string $postname ]] ) si vous avez une phobie de la création d'objets.

curl_setopt($curl_handle, CURLOPT_POST, 1);
$args['file'] = curl_file_create('filename.png', 'image/png', 'filename.png');
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $args);
41
répondu Danack 2014-03-16 04:08:37

Merci pour votre aide, en utilisant votre code de travail j'ai pu résoudre mon problème avec php 5.5 et facebook SDK. J'ai eu cette erreur dans le code de la classe sdk.

Je ne pense pas que cela compte comme une réponse, mais je suis sûr qu'il ya des gens qui cherchent cette erreur comme moi lié à Facebook SDK et php 5.5

dans le cas où quelqu'un a le même problème, la solution pour moi était de changer un petit code de base_facebook.php pour utiliser la classe CurlFile au lieu de la @filename.

depuis que j'appelle le sdk de plusieurs endroits, je viens de modifier quelques lignes du sdk:

dans la méthode appelée "makeRequest" j'ai fait ce changement:

Dans cette partie du code:

if ($this->getFileUploadSupport()){
    $opts[CURLOPT_POSTFIELDS] = $params;
} else {
    $opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
}

modifier la première partie (avec le téléchargement de fichier activé) en:

if ($this->getFileUploadSupport()){
  if(!empty($params['source'])){
     $nameArr = explode('/', $params['source']);
     $name    = $nameArr[count($nameArr)-1]; 
     $source  = str_replace('@', '', $params['source']);
     $size    = getimagesize($source); 
     $mime    = $size['mime'];
     $params['source'] = new CurlFile($source,$mime,$name);
  }

  if(!empty($params['image'])){
     $nameArr = explode('/', $params['image']);
     $name    = $nameArr[count($nameArr)-1]; 
     $image   = str_replace('@', '', $params['image']);
     $size    = getimagesize($image); 
     $mime    = $size['mime'];
     $params['image'] = new CurlFile($image,$mime,$name);
  }
  $opts[CURLOPT_POSTFIELDS] = $params;
} else {
    $opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
}

peut-être que cela peut être amélioré par le parsing à chaque $ param et de la recherche de '@' dans la valeur.. mais je l'ai fait juste pour source et image parce qu'était ce dont j'avais besoin.

5
répondu Claudio Romano 2013-07-18 18:27:16

pour curl_setopt (): l'utilisation de l'API @filename pour le téléchargement de fichiers est dépréciée. Veuillez utiliserl'CURLFile classe à la place

$img='image.jpg';

$data_array = array(
        'board' => $board_id,
        'note' => $note,
        'image' => new CurlFile($img)
    );

$curinit = curl_init($url);
     curl_setopt($curinit, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($curinit, CURLOPT_POST, true);
     curl_setopt($curinit, CURLOPT_CUSTOMREQUEST, "POST");
     curl_setopt($curinit, CURLOPT_POSTFIELDS, $data_array);
     curl_setopt($curinit, CURLOPT_SAFE_UPLOAD, false);
     $json = curl_exec($curinit);
     $phpObj = json_decode($json, TRUE);  
     return $phpObj;
1
répondu Rahul Sid 2016-07-21 11:42:01

CURLFile a été bien expliqué ci-dessus, mais pour les transferts simples d'un fichier où vous ne voulez pas envoyer un message multipart (pas nécessaire pour un fichier, et certains API ne prennent pas en charge multipart), puis les travaux suivants.

$ch = curl_init('https://example.com');

$verbose = fopen('/tmp/curloutput.log', 'w+'); // Not for production, but useful for debugging curl issues.

$filetocurl = fopen(realpath($filename), 'r');

// Input the filetocurl via fopen, because CURLOPT_POSTFIELDS created multipart which some apis do not accept.

// Change the options as needed.

$options = array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => array(
        'Content-type: application/whatever_you_need_here',
        'Authorization: Basic ' . $username . ":" . $password) // Use this if you need password login
    ),
    CURLOPT_NOPROGRESS => false,
    CURLOPT_UPLOAD => 1,
    CURLOPT_TIMEOUT => 3600,
    CURLOPT_INFILE => $filetocurl,
    CURLOPT_INFILESIZE => filesize($filename),
    CURLOPT_VERBOSE => true,
    CURLOPT_STDERR => $verbose  // Remove this for production
);

if (curl_setopt_array($ch, $options) !== false) {
    $result = curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);
} else {
    // A Curl option could not be set. Set exception here
}

notez que le code ci - dessus a un peu de débogage supplémentaire-les supprimer une fois qu'il fonctionne.

0
répondu brianlmerritt 2017-06-22 08:24:24