Start · Sprachen · PHP · Referenz · CURLFile

CURLFile

Klasse

Repräsentiert eine Datei, die per cURL-POST (<code>CURLOPT_POSTFIELDS</code>) hochgeladen werden soll.

seit PHP 5.5.0 Kategorie: http

Signatur

class CURLFile

Beschreibung

CURLFile ist die moderne, sichere Methode, um Dateien über eine cURL-POST-Anfrage hochzuladen. Vor PHP 5.5 wurde dazu der @-Präfix vor dem Dateipfad verwendet, was jedoch seit PHP 5.6 als veraltet gilt und in neueren Versionen nicht mehr unterstützt wird. Mit CURLFile werden Dateiname, MIME-Typ und ein optionaler Dateiname für die Übertragung klar und explizit angegeben.

Ein CURLFile-Objekt wird in einem Array übergeben, das als Wert von CURLOPT_POSTFIELDS gesetzt wird. Es wird dann als multipart/form-data-Upload gesendet, was dem HTML-Datei-Upload-Formular entspricht.

Folgende öffentliche Eigenschaften stehen zur Verfügung: name (Pfad zur Datei), mime (MIME-Typ der Datei) und postname (Dateiname im POST-Upload). Diese können auch über die bereitgestellten Getter- und Setter-Methoden gelesen und gesetzt werden.

Für das Hochladen von Dateiinhalten, die bereits als String vorliegen (ohne eine tatsächliche Datei auf der Festplatte), steht seit PHP 8.1 die Klasse CURLStringFile zur Verfügung.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Pfad zur Datei, die hochgeladen werden soll. Muss ein gültiger, lesbarer Dateipfad auf dem Server sein.
$mime_type string MIME-Typ der Datei, z. B. image/jpeg oder application/pdf. Wird dieser Wert weggelassen, versucht cURL, den MIME-Typ automatisch zu ermitteln.
$posted_filename string Dateiname, der im POST-Request an den Server übermittelt wird. Wenn nicht angegeben, wird der Basis-Dateiname aus filename verwendet.

Beispiele

Bild per cURL-POST hochladen

<?php
$ch = curl_init('https://example.com/upload.php');

$cfile = new CURLFile('/var/www/uploads/foto.jpg', 'image/jpeg', 'mein-foto.jpg');

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
    'benutzername' => 'max',
    'datei'        => $cfile,
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$antwort = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'cURL-Fehler: ' . curl_error($ch);
} else {
    echo 'Server-Antwort: ' . $antwort;
}

curl_close($ch);
Server-Antwort: Upload erfolgreich

Mehrere Dateien gleichzeitig hochladen

<?php
$ch = curl_init('https://example.com/multi-upload.php');

$datei1 = new CURLFile('/pfad/zur/dokument.pdf', 'application/pdf', 'dokument.pdf');
$datei2 = new CURLFile('/pfad/zum/bild.png', 'image/png', 'bild.png');

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
    'titel'   => 'Mehrfach-Upload-Test',
    'datei1'  => $datei1,
    'datei2'  => $datei2,
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$antwort = curl_exec($ch);
echo $antwort;

curl_close($ch);

Getter- und Setter-Methoden von CURLFile nutzen

<?php
$cfile = new CURLFile('/var/www/daten/bericht.pdf');

// MIME-Typ nachträglich setzen
$cfile->setMimeType('application/pdf');

// Anzeigenamen für den Upload setzen
$cfile->setPostFilename('quartalsbericht-2024.pdf');

echo 'Dateipfad: '  . $cfile->getFilename()     . PHP_EOL;
echo 'MIME-Typ: '   . $cfile->getMimeType()      . PHP_EOL;
echo 'POST-Name: '  . $cfile->getPostFilename()  . PHP_EOL;
Dateipfad: /var/www/daten/bericht.pdf MIME-Typ: application/pdf POST-Name: quartalsbericht-2024.pdf

// Wichtig · Fallstricke

Sicherheitshinweis: Stellen Sie sicher, dass der Dateipfad, der an CURLFile übergeben wird, nicht aus nicht validierten Benutzereingaben stammt. Andernfalls könnte ein Angreifer beliebige Dateien vom Server hochladen (z. B. /etc/passwd). Validieren Sie Pfade stets mit realpath() und prüfen Sie, ob die Datei innerhalb eines erlaubten Verzeichnisses liegt.

Veralteter @-Präfix: Der alte Stil 'datei' => '@/pfad/zur/datei.jpg' ist seit PHP 5.6 veraltet und wurde in PHP 7.0 entfernt. Verwenden Sie ausschließlich CURLFile.

String-basierter Upload: Wenn Sie Dateiinhalte als String (ohne eine physische Datei) hochladen möchten, nutzen Sie stattdessen CURLStringFile (verfügbar ab PHP 8.1).