it-swarm.com.de

Kann mir jemand ein Beispiel für die CURLFile-Klasse von PHP geben?

Ich hatte einen sehr einfachen PHP Code, um eine Datei auf einen Remote-Server hochzuladen. Die Art und Weise, wie ich es gemacht habe (wie hier in einigen anderen Lösungen vorgeschlagen) ist, cUrl zum Hochladen der Datei zu verwenden. 

Hier ist mein 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);        

Der Server führt PHP 5.5.0 aus, und es scheint, dass @filename in PHP> = 5.5.0 wie angegeben hier unter der CURLOPT_POSTFIELDS-Beschreibung veraltet ist, und daher bin ich diesen Fehler bekommen:

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

Interessanterweise enthält diese Klasse auf php.net absolut nichts, abgesehen von einer einfachen Klassenübersicht. Keine Beispiele, keine Beschreibung von Methoden oder Eigenschaften. Es ist im Grunde leer hier . Ich verstehe, dass es sich um eine brandneue Klasse mit wenig bis gar keiner Dokumentation und sehr wenig Verwendung in der realen Welt handelt, weshalb in Google bei Google oder hier bei Stackoverflow in dieser Klasse praktisch nichts relevantes angezeigt wird.

Ich frage mich, ob es jemanden gibt, der diese CURLFile-Klasse verwendet hat und mir möglicherweise helfen kann oder mir ein Beispiel gibt, wie er anstelle von @filename in meinem Code verwendet wird.

Bearbeiten:

Ich wollte auch meinen "upload.php" -Code hinzufügen; Dieser Code würde mit der traditionellen @ filename-Methode funktionieren, funktioniert jedoch nicht mehr mit dem CURLFile-Klassencode:

$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";
}

Final Edit:

Wollte Final/Working-Code für andere hinzufügen, die ein ähnliches Arbeitsbeispiel für die kaum dokumentierte CURLFile-Klasse suchen ... 

curl.php (lokaler Server)

<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);       
}
?>

upload.php (entfernter Server)

$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";
} 
33
luci5r

Auf dem RFC ist ein Ausschnitt für den Code vorhanden: 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);

Sie können auch die scheinbar sinnlose Funktion curl_file_create( string $filename [, string $mimetype [, string $postname ]] ) verwenden, wenn Sie eine Phobie beim Erstellen von Objekten haben. 

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);
45
Danack

Vielen Dank für Ihre Hilfe. Mit Ihrem Arbeitscode konnte ich mein Problem mit PHP 5.5 und Facebook SDK lösen. Ich habe diese Fehlermeldung vom Code in der Sdk-Klasse erhalten.

Ich denke nicht, dass dies als Reaktion gezählt wird, aber ich bin sicher, dass es Leute gibt, die nach diesem Fehler suchen wie ich, der sich auf Facebook SDK und PHP 5.5 bezieht

Für den Fall, dass jemand das gleiche Problem hat, bestand die Lösung für mich darin, einen kleinen Code von base_facebook.php so zu ändern, dass die CurlFile-Klasse anstelle von @filename verwendet wird.

Da ich die SDK von mehreren Orten aus anrufe, habe ich gerade ein paar Zeilen der SDK geändert:

In der Methode "makeRequest" habe ich diese Änderung vorgenommen:

In diesem Teil des Codes:

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

Ändern Sie den ersten Teil (mit aktiviertem Dateiupload) in:

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, '&');
}

Vielleicht kann dies verbessert werden, indem alle $ param analysiert werden und nach '@' im Wert gesucht wird. Aber ich habe es nur für source und image getan, weil ich genau das brauchte.

5
Claudio Romano

FOR curl_setopt (): Die Verwendung der @Dateiname-API für das Hochladen von Dateien ist veraltet. Verwenden Sie stattdessen die Klasse CURLFile

$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
Rahul Sid

Php POST - Anforderung, mehrere Dateien mit Curl-Funktion zu senden:

<?php
    $file1 = realpath('ads/ads0.jpg');
    $file2 = realpath('ads/ads1.jpg');
    // Old method
    // Single file
    // $data = array('name' => 'Alexia', 'address' => 'Usa', 'age' => 21, 'file' => '@'.$file1);    
    // $data = array('name' => 'Alexia', 'address' => 'Usa', 'age' => 21, 'file[0]' => '@'.$file1, 'file[1]' => '@'.$file2);
    // CurlFile method   
    $f1 = new CurlFile($file1, mime_content_type($file1), basename($file1)); 
    $f2 = new CurlFile($file2, mime_content_type($file2), basename($file2)); 
    $data = array('name' => 'Alexia', 'address' => 'Usa', 'age' => 21, 'file[1]' => $f1, 'file[2]' => $f2);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://url.x/upload.php');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); // !!!! required as of PHP 5.6.0 for files !!!
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);    
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 1, 2
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    $res2 = curl_exec($ch);
    echo $res2;
?>

<?php
    // upload.php
    $json = json_decode(file_get_contents('php://input'), true);
    if(!empty($json)){ print_r($json); }
    if(!empty($_GET)){ print_r($_GET); }
    if(!empty($_POST)){ print_r($_POST); }
    if(!empty($_FILES)){ print_r($_FILES); }
?>
0
Max

CURLFile wurde oben bereits ausführlich erläutert. Wenn Sie jedoch nur eine einzige Datei übertragen möchten, bei der Sie keine mehrteilige Nachricht senden möchten (nicht für eine Datei erforderlich und einige APIs unterstützen nicht mehrteilig), funktionieren die folgenden.

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

Beachten Sie, dass der obige Code einige zusätzliche Fehlerbehebungen enthält - entfernen Sie sie, sobald sie funktionieren.

0
brianlmerritt