Bild per API hochladen

Servus,

ich kämpfe seit Tagen mit der Doku: https://shopware.stoplight.io/docs/admin-api/c042ae0cd330f-media-handling#upload-the-resource-directly

Bekomme da immer als Fehler

„{„errors“:[{„status“:„500“,„code“:„CONTENT__MEDIA_UPLOAD“,„title“:„Internal Server Error“,„detail“:„No file extension provided. Please use the \u0022extension\u0022 query parameter to specify the extension of the uploaded file“,„meta“:{„parameters“:{„message“:„No file extension provided. Please use the \u0022extension\u0022 query parameter to specify the extension of the uploaded file“}}}]}“

Meine Daten:

Url: „/api/_action/media/6965129d6c68406c93fa74c7ef2696b7/upload“
Accept: {„application/json“}
Content-Type: {„image/jpg“}
extension: {„jpg“}

Mit und ohne extension, immer gleiche Fehlermeldung. Beim Content hab ichs schon nur mit dem Dateinamen probiert und auch als String (Inhalt des Bildes).

Was mache ich falsch? Die Doku hierzu passt nicht?

Beim Dateinamen mal mit und ohne Extension versucht? Wenn ich mich recht erinnere, muss es ohne Extension sein, sprich nur der Name. und in extension entsprechend die Extension.

Danke, ja, hatte ich auch schon.

Hab jetzt doch was gefunden, ich hatte die extension als Header angegeben und nicht als Query-Parameter. Jetzt hab ich die Fehlermeldung:

„{„errors“:[{„status“:„404“,„code“:„CONTENT__MEDIA_NOT_FOUND“,„title“:„Not Found“,„detail“:„Media for id 6965129d6c68406c93fa74c7ef2696b7 not found.“,„meta“:{„parameters“:{„mediaId“:„6965129d6c68406c93fa74c7ef2696b7“}}}]}“

Wie muss der Content aussehen? So?

„{D:/daten/Artikel/33000520296/BV_Kopfzeile.jpg“: null}"

braucht sicher noch ein paar Anpassungen …

$pi = pathinfo($file_local_full);

$url  = $this->shopUrl . '/api/_action/media/' . $mediaId . '/upload?';
$url .= 'extension=' . $pi['extension'];
$url .= '&fileName=' . urlencode($pi['filename']);

$content_type = $storage->mimeType($asset->getRealFullPath()); 

$headers = array(
    "Content-Type: $content_type", // or whatever you want
    // here muss der Token rein (mit Bearer)
    "Authorization: " . $this->getAuthHeader()
);

// müsste aus dem Path berechnet werden
$filesize = 1234;
$stream = fopen($path, 'r'); 

$curl_opts = array(
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_PUT => true,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_INFILE => $stream,
    CURLOPT_VERBOSE => 0,
    CURLOPT_INFILESIZE => $filesize,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1
);

$curl = curl_init();
curl_setopt_array($curl, $curl_opts);

$response = curl_exec($curl);

fclose($stream);
1 „Gefällt mir“