Bildupload über API

Hallo,

ich versuche ein Bild über die API hochzuladen und habe mich an den Artikel "Image Upload über REST-API gehalten.

Ich nutze VB.NET und RestSharp:

Das Bild anlegen und die MediaID erhalten funktioniert, jedoch bekomme ich beim Hochladen einen Fehler:
„{„errors“:[{„status“:„400“,„code“:„CONTENT__MEDIA_UPLOAD“,„title“:„Bad Request“,„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.“}}}]}“

Hier ist mein Code:

            ' ##### NEUES BILD IN DIESE ID EINFÜGEN #####

            request = New RestRequest("_action/media/{mediaID}/upload", Method.Post)
            request.AddHeader("Authorization", "Bearer " & ShopwareToken.bearerToken)
            'request.AddHeader("Content-Type", "application/octet-stream")
            'request.AddParameter("application/octet-stream", "string", ParameterType.RequestBody)
            request.AddParameter("extension", dateiErweiterung)
            request.AddParameter("fileName", dateiName)

            ' Lese den Inhalt des Bildes in einen Byte-Array ein
            Dim fileBytes As Byte() = File.ReadAllBytes(filename)

            ' Setze den Content-Type des Request-Headers auf "multipart/form-data"
            request.AddHeader("Content-Type", "multipart/form-data")

            ' Füge die Datei als Parameter zum Request hinzu
            request.AddParameter("file", fileBytes, ParameterType.RequestBody)

            request.AddUrlSegment("mediaID", mediaID)

            response = client.Execute(request)

Ich habe auch mit der in restsharp verfügbaren Methode .Addfile experimentiert, bekomme aber denselben Fehler…

Was mache ich falsch?

das Ganze ist ein wenig „speziell“ :slight_smile:
(ich habe hier ein paar Snippets reingesetzt, C# lässt sich aber sicher als VB.net ähnlich lösen)

  1. extension und fileName kommen als Query an die URL (obwohl es ein POST ist)
string apiPath = "/api/_action/media/" + MediaId + "/upload?";
// (bei mir sieht das dann so aus: _action/media/[media_uuid]/upload? ...) 
apiPath += "extension=" + HttpUtility.UrlEncode(mediaUpload.Extension);
apiPath += "&fileName=" + HttpUtility.UrlEncode(mediaUpload.Filename);
  1. das ist KEIN multipart/form-data Post, sondern die Binärdaten liegen „einfach“ im Body. Der Content-Type ist der mime-type des Bildes.
ByteArrayContent byteArrayContent = new ByteArrayContent(rawBytes);
byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("image/" + mediaUpload.Extension.ToLower());
byteArrayContent.Headers.ContentLength = rawBytes.LongLength;
  1. auch geht kein file parameter
    siehe 2)

  2. das Byte Array wird einfach im Body gepostet

HttpResponseMessage result = httpClient.PostAsync(apiPath, byteArrayContent).Result;

herzlichst

Carsten Harnisch
– media at work

Danke für die Tipps. Die haben bei meiner Umsetzung geholfen. :slight_smile:

Dieses Thema wurde automatisch 30 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.