Produkt-Bilder über API hochladen?

Hallo,

ich hätte eine Frage ob jemand das Problem kennt bzw. weiss was ich falsch mache.

Soweit habe ich alles - und würde dann anhand der mediaId einen Post absetzen um das Bild hochzuladen.

Als Body gebe ich die url mit:

 https://www.matamoto.de/api/v1/\_action/media/30bc6bc7630043daab5bdc3f90dfd489/upload?extension=jpg&fileName=149289

 [0] =\> Array ( [url] =\> https://pfad-zum-bild.de/bild/149289.jpg )

Bekomme aber immer diese Fehlermeldung

 {"errors":[{"status":"500","code":"CONTENT\_\_MEDIA\_UPLOAD","title":"Internal Server Error","detail":"You must provide a valid url.","meta":{"parameters":{"message":"You must provide a valid url."}}}]}

Die Bildurl ist aber richtig…

Kann mir jemand einen Tipp geben?

Danke

Hi Steve,

in JSON sollte der Payload so aussehen:

{
	"url": "https://image.shutterstock.com/image-vector/example-red-square-grunge-stamp-260nw-327662909.jpg"
}

In PHP sollte das dann somit sein:

[
   'url' => 'https://image.shutterstock.com/image-vector/example-red-square-grunge-stamp-260nw-327662909.jpg'
]

Sieht bei deiner Angabe so aus, als ob du das Array zu weit verschachtelt hast…

Hoffe das hilft dir weiter.

Gruß

Krispin

Hey,

erstmals Danke.

Aber auch hier das selbe in grün

 Array ( [url] =\> https://bildpfad.de/img/products/00/149289 . jpg ) {"errors":[{"status":"500","code":"CONTENT\_\_MEDIA\_UPLOAD","title":"Internal Server Error","detail":"You must provide a valid url.","meta":{"parameters":{"message":"You must provide a valid url."}}}]}

Hoffentlich macht er jetzt kein Bild draus :slight_smile:

Oder brauche ich beim curl Aufruf was besonderes?

Mein Aufruf

 curl\_setopt($this-\>cURL, CURLOPT\_HTTPHEADER,$this-\>authHeader); curl\_setopt($this-\>cURL,CURLOPT\_URL,$url); curl\_setopt($this-\>cURL,CURLOPT\_SSL\_VERIFYHOST,0); curl\_setopt($this-\>cURL,CURLOPT\_SSL\_VERIFYPEER,0); curl\_setopt($this-\>cURL, CURLOPT\_POST, 1); if (!empty($data)) curl\_setopt($this-\>cURL, CURLOPT\_POSTFIELDS, json\_encode($data,JSON\_UNESCAPED\_SLASHES)); curl\_setopt($this-\>cURL,CURLOPT\_RETURNTRANSFER, true);

Danke

Hi Steven,

ich weiß ja nicht wir du den Payload überträgst, es sieht mir aber danach aus, als ob der Parameter nicht per POST-Body mitgeschickt wird.
Sonst müsstest du mal schauen, wie dein Request bei dem MediaUploadController in der upload-Action ankommt.

Gruß

Krispin

wie verhindert ihr hier Duplikate?

Ich möchte täglich einen Produktabgleich machen, der natürlich auch Bilder dabei hat. Da würden dann ja jedes Mal die Bilder komplett neu importiert…

über einen GET auf die ID gehts nicht, denn dann kommt eine Exception falls es die Medien-ID noch nicht gibt…

Auch hier kann ich nur Python bieten, ich hol mir einfach alle Bilder mit dem Dateinamen und lösche diese dann:

requrl = shopurl + "/api/v1/media?filter[fileName]=" + os.path.split(r"C:\meinbild.jpg")[-1].split(".")[0]
headers = {"Accept": "application/json", "Authorization" : "Bearer " + token}
r = requests.get(requrl, headers=headers)
r = json.loads(r.text)
for data in r["data"]:
 if data["fileName"] == os.path.split(r"C:\meinbild.jpg")[-1].split(".")[0]:
  requrl = shopurl + "/api/v1/media/" + data["id"]
  headers = {"Accept": "application/json", "Authorization" : "Bearer " + token}
  r = requests.delete(requrl, headers=headers)

 

Hey,
Hier mal meine Erfahrungen mit den Vorgestellten Lösungen:
Die Lösung von canetti2klappt nur für URLs die Außerhalb des eigenen privaten Netzwerkes liegen. Uploads von Servern mit IP-Adressen wie 192.168.XXX.XXX oder 10.0.XX.XXX werden mit der Fehlercode: CONTENT__MEDIA_ILLEGAL_URL abgewießen. Das ganze passiert aufgrund der Klasse
FileUrlValidator, welche die angegebenen URLs prüft.

Dazu mal eine Frage: Gibt es eine Möglichkeit um Bilder per API von lokalen URLs hochzuladen? Wenn nicht, sei mir bitte folgende naive Frage gestattet: Warum nicht?

Für alle die Bilder von ihrem lokalen Filesystem mithilfe der API hochladen wollen gibt es folgende Möglichkeit:

  1. (siehe Lösung canetti2)

POST an media?_response=true
Request Payload: die mediaFolderId, in der ich das Bild speichern möchte:

{“mediaFolderId”:“cef84bd4991c4055a7b02388dc49ca70” }

Als Response erhält man dann die neu erzeugte media-ID

Unter Angabe der neuen media-ID ein zweiter POST an /api/v2/_action/media/media-ID/upload?extension=jpg&fileName=bildname
mit Content-Type: image/jpeg und als Payload die binären Daten des Bildes.
CURL-Beispiel:

curl -H "Content-Type: image/jpeg" -H "Authorization: Bearer 1234" -request POST --data-binary "@./beispiel.jpg" "localhost/api/v2/_action/media/media-id/upload?extension=jpg&fileName=amah"

 

Hallo!

Der Punkt 1) „Das Anlegen des leeren media Objekts“ mit Rückgabe der media-ID klappt bei mir.

Beim Punkt 2) erhalte ich allerdings folgende Meldung:

{„errors“:[{„code“:„0“,„status“:„415“,„title“:„Unsupported Media Type“,„detail“:„All provided media types are unsupported. ()“}]}

 

Weiß jemand Rat?

 

Hier mal mein C# Code für den Punkt 2):

                byte myImageData = null;
                using (System.IO.FileStream myFS = System.IO.File.Open(pFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
                {
                    myImageData = new byte[myFS.Length];
                    myFS.Read(myImageData, 0, (int)myFS.Length);
                    myFS.Close();
                }
                var requestContent = new MultipartFormDataContent();
                var imageContent = new ByteArrayContent(myImageData);
                imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse(„image/jpeg“);
                requestContent.Add(imageContent, „image“, „image.jpg“);
                using (var myClient = new HttpClient())
                {
                    myClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(„Bearer“, gBearerKey);
                    myClient.BaseAddress = new Uri(gShopMainUrl);

                    string strUriAdd = „/api/v3/_action/media/“ + strMediaId + „/upload?extension=jpg&fileName=“ + Path.GetFileName(pFileName);
                    HttpResponseMessage result = myClient.PostAsync(strUriAdd, requestContent).Result;

                    strResult = result.Content.ReadAsStringAsync().Result;
                }

Bei mir exakt das gleiche Problem!

Mit dem curl-Befehl von @paracel kann ich ein Bild hochladen, nicht aber mit meiner Funktion. Erhalte auch diesen Fehler…

 

@Reimers schrieb:

Hallo!

Der Punkt 1) “Das Anlegen des leeren media Objekts” mit Rückgabe der media-ID klappt bei mir.

Beim Punkt 2) erhalte ich allerdings folgende Meldung:

{“errors”:[{“code”:“0”,“status”:“415”,“title”:“Unsupported Media Type”,“detail”:“All provided media types are unsupported. ()”}]}

 

Weiß jemand Rat?

 

Hier mal mein C# Code für den Punkt 2):

                byte myImageData = null;
                using (System.IO.FileStream myFS = System.IO.File.Open(pFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
                {
                    myImageData = new byte[myFS.Length];
                    myFS.Read(myImageData, 0, (int)myFS.Length);
                    myFS.Close();
                }
                var requestContent = new MultipartFormDataContent();
                var imageContent = new ByteArrayContent(myImageData);
                imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse(“image/jpeg”);
                requestContent.Add(imageContent, “image”, “image.jpg”);
                using (var myClient = new HttpClient())
                {
                    myClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(“Bearer”, gBearerKey);
                    myClient.BaseAddress = new Uri(gShopMainUrl);

                    string strUriAdd = “/api/v3/_action/media/” + strMediaId + “/upload?extension=jpg&fileName=” + Path.GetFileName(pFileName);
                    HttpResponseMessage result = myClient.PostAsync(strUriAdd, requestContent).Result;

                    strResult = result.Content.ReadAsStringAsync().Result;
                }

Hallo @Reimers‍, 

ich kenne C# nicht wirklich… aber kann es sein, dass du statt “Path.GetFileName(pFileName)” eher “path.getfilenamewithoutextension(pFileName)” übergeben musst ?

Bei fileName wird der Dateiname ohne Endung erwartet.

Grüße

Holger 

Hallo Holger,

vielen Dank für Deinen Tipp!

Allerdings war es das leider nicht.
Auch mit einer anderen Datei oder einer .png klappt es nicht.
Alle meine Test Dateien sind weniger als 150KB groß. An der Größe sollte es auch nicht liegen.

Als Fehlermeldung erhalte ich immer: ‚Unsupported Media Type‘ detail: ‚All provided media types are unsupported.‘

Hier noch mal mein C# Code für den Punkt 2):

                byte myImageData = null;
                using (System.IO.FileStream myFS = System.IO.File.Open(pFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
                {
                    myImageData = new byte[myFS.Length];
                    myFS.Read(myImageData, 0, (int)myFS.Length);
                    myFS.Close();
                }
                var requestContent = new MultipartFormDataContent();
                var imageContent = new ByteArrayContent(myImageData);
                imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse(„image/jpeg“);
                requestContent.Add(imageContent, „image“, Path.GetFileName(pFileName));
                using (var myClient = new HttpClient())
                {
                    myClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(„Bearer“, gBearerKey.Replace(’"’, ’ ').Trim());
                    myClient.BaseAddress = new Uri(gShopMainUrl);

                    string strUriAdd = „/api/v3/_action/media/“ + strMediaId + „/upload?extension=jpg&fileName=“ + Path.GetFileNameWithoutExtension(pFileName);
                    HttpResponseMessage result = myClient.PostAsync(strUriAdd, requestContent).Result;

                    strResult = result.Content.ReadAsStringAsync().Result;

                }

 

Wirf doch mal Wireshark an und vergleiche den funktionierenden Aufruf mit dem nicht funktionierenden…

1 Like

@ThomasChr schrieb:

Wirf doch mal Wireshark an und vergleiche den funktionierenden Aufruf mit dem nicht funktionierenden…

Danke für den Tipp mit Wireshark. Ich habe es mal ausprobiert und den curt-Request sowie den Request aus meinem Script aufgezeichnet. Leider verstehe ich zu wenig von den Protokollen und verstehe es nicht ganz. Was mir auffällt ist, dass der “Frame” aus curl wesentlich mehr Bytes beinhaltet als der “Frame” aus dem Request meines Scripts.

Request aus curl (Bild wird erfolgreich zu Shopware übertragen)

Frame 8: 15290 bytes on wire (122320 bits), 15290 bytes captured (122320 bits) on interface \Device\NPF_Loopback, id 9
    Interface id: 9 (\Device\NPF_Loopback)
        Interface name: \Device\NPF_Loopback
    Encapsulation type: NULL/Loopback (15)
    Arrival Time: Sep 30, 2020 11:22:53.688723000 Mitteleuropäische Sommerzeit
    [Time shift for this packet: 0.000000000 seconds]
    Epoch Time: 1601457773.688723000 seconds
    [Time delta from previous captured frame: 0.000200000 seconds]
    [Time delta from previous displayed frame: 0.000200000 seconds]
    [Time since reference or first frame: 0.012244000 seconds]
    Frame Number: 8
    Frame Length: 15290 bytes (122320 bits)
    Capture Length: 15290 bytes (122320 bits)
    [Frame is marked: False]
    [Frame is ignored: False]
    [Protocols in frame: null:ipv6:tcp:http:image-jfif]
    [Coloring Rule Name: HTTP]
    [Coloring Rule String: http || tcp.port == 80 || http2]
Null/Loopback
    Family: IPv6 (24)
Internet Protocol Version 6, Src: ::1, Dst: ::1
    0110 .... = Version: 6
    .... 0000 0000 .... .... .... .... .... = Traffic Class: 0x00 (DSCP: CS0, ECN: Not-ECT)
        .... 0000 00.. .... .... .... .... .... = Differentiated Services Codepoint: Default (0)
        .... .... ..00 .... .... .... .... .... = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    .... .... .... 0001 1100 0000 1110 1011 = Flow Label: 0x1c0eb
    Payload Length: 15246
    Next Header: TCP (6)
    Hop Limit: 128
    Source: ::1
    Destination: ::1
Transmission Control Protocol, Src Port: 59457, Dst Port: 81, Seq: 925, Ack: 26, Len: 15226
    Source Port: 59457
    Destination Port: 81
    [Stream index: 0]
    [TCP Segment Len: 15226]
    Sequence number: 925 (relative sequence number)
    Sequence number (raw): 130466723
    [Next sequence number: 16151 (relative sequence number)]
    Acknowledgment number: 26 (relative ack number)
    Acknowledgment number (raw): 2525943079
    0101 .... = Header Length: 20 bytes (5)
    Flags: 0x018 (PSH, ACK)
    Window size value: 10230
    [Calculated window size: 2618880]
    [Window size scaling factor: 256]
    Checksum: 0x8553 [unverified]
    [Checksum Status: Unverified]
    Urgent pointer: 0
    [SEQ/ACK analysis]
    [Timestamps]
    TCP payload (15226 bytes)
    TCP segment data (15226 bytes)
[2 Reassembled TCP Segments (16150 bytes): #4(924), #8(15226)]
    [Frame: 4, payload: 0-923 (924 bytes)]
    [Frame: 8, payload: 924-16149 (15226 bytes)]
    [Segment count: 2]
    [Reassembled TCP length: 16150]
    [Reassembled TCP Data: 504f5354202f73686f70776172652d64656d6f2f7075626c…]
Hypertext Transfer Protocol
    POST /shopware-demo/public/api/v2/_action/media/ffa0bfea4a2d43c383a630ae5575e06e/upload?extension=jpg&fileName=test30092020 HTTP/1.1\r\n
    Host: localhost:81\r\n
    Content-Range: bytes equest/15226\r\n
    User-Agent: curl/7.55.1\r\n
    Accept: */*\r\n
    Content-Type: image/jpeg\r\n
     [truncated]Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjM3YTAzY2Q2ZDQzZDQ1ZDZkMjU1M2JhNzQ2ZjlhOTQ0N2MzOTY2NDRlZDU5MzgxN2UzMmM4ZTkyYWQwN2FkNzgxZmQ2NTMyZDQ4ZDEyY2I4In0.eyJhdWQiOiJTV0lBVEhFM1FYQlpXWEpTV05WVllKUk9VQSIs
    Content-Length: 15226\r\n
    Expect: 100-continue\r\n
    \r\n
    [Full request URI: http://localhost:81/shopware-demo/public/api/v2/_action/media/ffa0bfea4a2d43c383a630ae5575e06e/upload?extension=jpg&fileName=test30092020]
    [HTTP request 2/2]
    [Response in frame: 10]
    File Data: 15226 bytes
JPEG File Interchange Format
    Marker: Start of Image (0xffd8)
    Marker segment: Reserved for application segments - 0 (0xFFE0)
    Marker segment: Reserved for application segments - 13 (0xFFED)
    Marker segment: Reserved for application segments - 1 (0xFFE1)
    Marker segment: Reserved for application segments - 1 (0xFFE1)
    Marker segment: Define quantization table(s) (0xFFDB)
    Marker segment: Define quantization table(s) (0xFFDB)
    Start of Frame header: Start of Frame (non-differential, Huffman coding) - Baseline DCT (0xFFC0)
    Marker segment: Define Huffman table(s) (0xFFC4)
    Marker segment: Define Huffman table(s) (0xFFC4)
    Marker segment: Define Huffman table(s) (0xFFC4)
    Marker segment: Define Huffman table(s) (0xFFC4)
    Start of Segment header: Start of Scan (0xFFDA)
    Entropy-coded segment (dissection is not yet implemented): efea00a00a00a00a00a00a00a00a00a00a00a00a00a00a00…
    Marker: End of Image (0xffd9)

es folgt zweiter Teil…

Und hier der zweite Teil…

Request aus meine Script (Bild kann nicht übertragen werden)

Frame 33: 934 bytes on wire (7472 bits), 934 bytes captured (7472 bits) on interface \Device\NPF_Loopback, id 9
    Interface id: 9 (\Device\NPF_Loopback)
        Interface name: \Device\NPF_Loopback
    Encapsulation type: NULL/Loopback (15)
    Arrival Time: Sep 30, 2020 11:28:19.184148000 Mitteleuropäische Sommerzeit
    [Time shift for this packet: 0.000000000 seconds]
    Epoch Time: 1601458099.184148000 seconds
    [Time delta from previous captured frame: 0.000044000 seconds]
    [Time delta from previous displayed frame: 0.000044000 seconds]
    [Time since reference or first frame: 1.051857000 seconds]
    Frame Number: 33
    Frame Length: 934 bytes (7472 bits)
    Capture Length: 934 bytes (7472 bits)
    [Frame is marked: False]
    [Frame is ignored: False]
    [Protocols in frame: null:ip:tcp:http:image-jfif]
    [Coloring Rule Name: HTTP]
    [Coloring Rule String: http || tcp.port == 80 || http2]
Null/Loopback
    Family: IP (2)
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
    Total Length: 930
    Identification: 0x8a8e (35470)
    Flags: 0x4000, Don't fragment
    Fragment offset: 0
    Time to live: 128
    Protocol: TCP (6)
    Header checksum: 0x0000 [validation disabled]
    [Header checksum status: Unverified]
    Source: 127.0.0.1
    Destination: 127.0.0.1
Transmission Control Protocol, Src Port: 59843, Dst Port: 81, Seq: 15166, Ack: 1, Len: 890
    Source Port: 59843
    Destination Port: 81
    [Stream index: 0]
    [TCP Segment Len: 890]
    Sequence number: 15166 (relative sequence number)
    Sequence number (raw): 3066857674
    [Next sequence number: 16056 (relative sequence number)]
    Acknowledgment number: 1 (relative ack number)
    Acknowledgment number (raw): 2919606326
    0101 .... = Header Length: 20 bytes (5)
    Flags: 0x018 (PSH, ACK)
    Window size value: 32768
    [Calculated window size: 4194304]
    [Window size scaling factor: 128]
    Checksum: 0x2ff5 [unverified]
    [Checksum Status: Unverified]
    Urgent pointer: 0
    [SEQ/ACK analysis]
    [Timestamps]
    TCP payload (890 bytes)
    TCP segment data (890 bytes)
[9 Reassembled TCP Segments (16055 bytes): #17(829), #19(2048), #21(2048), #23(2048), #25(2048), #27(2048), #29(2048), #31(2048), #33(890)]
    [Frame: 17, payload: 0-828 (829 bytes)]
    [Frame: 19, payload: 829-2876 (2048 bytes)]
    [Frame: 21, payload: 2877-4924 (2048 bytes)]
    [Frame: 23, payload: 4925-6972 (2048 bytes)]
    [Frame: 25, payload: 6973-9020 (2048 bytes)]
    [Frame: 27, payload: 9021-11068 (2048 bytes)]
    [Frame: 29, payload: 11069-13116 (2048 bytes)]
    [Frame: 31, payload: 13117-15164 (2048 bytes)]
    [Frame: 33, payload: 15165-16054 (890 bytes)]
    [Segment count: 9]
    [Reassembled TCP length: 16055]
    [Reassembled TCP Data: 504f5354202f73686f70776172652d64656d6f2f7075626c…]
Hypertext Transfer Protocol
    POST /shopware-demo/public/api/v2/_action/media/ffa0bfea4a2d43c383a630ae5575e06e/upload?extension=jpg&fileName=test30092020 HTTP/1.1\r\n
    Host: localhost:81\r\n
    Content-Type: image/jpeg\r\n
     [truncated]Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjJjNDA4YWNlYzJjNzQ1NzA2MmZlM2Y4MjEyYjBjNzYyMGZmN2JkNjIxZTQ1MWVkZTJhNTg5MTQxOTk2YTFhZDQyMjQ4MzNjYWYzYmZkMTVmIn0.eyJhdWQiOiJTV0lBVEhFM1FYQlpXWEpTV05WVllKUk9VQSIs
    Content-Length: 15226\r\n
    \r\n
    [Full request URI: http://localhost:81/shopware-demo/public/api/v2/_action/media/ffa0bfea4a2d43c383a630ae5575e06e/upload?extension=jpg&fileName=test30092020]
    [HTTP request 1/1]
    [Response in frame: 35]
    File Data: 15226 bytes
JPEG File Interchange Format
    Marker: Start of Image (0xffd8)
    Marker segment: Reserved for application segments - 0 (0xFFE0)
    Marker segment: Reserved for application segments - 13 (0xFFED)
    Marker segment: Reserved for application segments - 1 (0xFFE1)
    Marker segment: Reserved for application segments - 1 (0xFFE1)
    Marker segment: Define quantization table(s) (0xFFDB)
    Marker segment: Define quantization table(s) (0xFFDB)
    Start of Frame header: Start of Frame (non-differential, Huffman coding) - Baseline DCT (0xFFC0)
    Marker segment: Define Huffman table(s) (0xFFC4)
    Marker segment: Define Huffman table(s) (0xFFC4)
    Marker segment: Define Huffman table(s) (0xFFC4)
    Marker segment: Define Huffman table(s) (0xFFC4)
    Start of Segment header: Start of Scan (0xFFDA)
    Entropy-coded segment (dissection is not yet implemented): efea00a00a00a00a00a00a00a00a00a00a00a00a00a00a00…
    Marker: End of Image (0xffd9)

 

path = "api/v1/_action/media/" + media.Id + "/upload?";
path += "extension=" + HttpUtility.UrlEncode(mediaUpload.Extension);
path += "&fileName=" + HttpUtility.UrlEncode(mediaUpload.Filename);

RestRequest requestUpload = new RestRequest(path, Method.POST);

using (HttpClient httpClient = new HttpClient())
{
    httpClient.DefaultRequestHeaders.Accept.Clear();
    httpClient.DefaultRequestHeaders.Accept.Add(
        new MediaTypeWithQualityHeaderValue("application/vnd.api+json"));

    httpClient.DefaultRequestHeaders.Add("Authorization", this.AuthHeader);

    byte[] rawBytes = File.ReadAllBytes(filepath);
    ByteArrayContent byteArrayContent = new ByteArrayContent(rawBytes);
    byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("image/" + mediaUpload.Extension.ToLower());
    byteArrayContent.Headers.ContentLength = rawBytes.LongLength;

    var result = httpClient.PostAsync(this._config.server + "/" + path, byteArrayContent).Result;
}

Oben der Code; ist so nicht ausführbar sollte aber in etwa das Prinzip zeigen. Letztlich wird das Image als binary gesendet. mediaUpload ist eine eigene Class. 

LG

3 Likes

Ich habe es nun auch geschafft. Ich lade die Bilder aus einer MS Access-Applikation hoch und habe dafür eine Komponente der Chilkat-API verwendet. Ich bin kein Protokollexperte, was ich aber herausgefunden habe ist, dass diese die Bilderdaten über TCP versendet. Curl dagegen packt alles in das HTTP-Paket.

Ich habe nun MSXML2.ServerXMLHTTP in Access verwendet und damit klappt es! Auch hier werden die Daten ins HTTP-Paket gepackt und damit läuft es.

Danke für die Hilfe!

Ohhh Carsten,

auch ich habe es jetzt mit Deinem Code geschafft!

Vielen Dank!

 

@CarstenHarnisch schrieb:

path = „api/v1/_action/media/“ + media.Id + „/upload?“;
path += „extension=“ + HttpUtility.UrlEncode(mediaUpload.Extension);
path += „&fileName=“ + HttpUtility.UrlEncode(mediaUpload.Filename);

RestRequest requestUpload = new RestRequest(path, Method.POST);

using (HttpClient httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(„application/vnd.api+json“));

httpClient.DefaultRequestHeaders.Add(„Authorization“, this.AuthHeader);

byte rawBytes = File.ReadAllBytes(filepath);
ByteArrayContent byteArrayContent = new ByteArrayContent(rawBytes);
byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue(„image/“ + mediaUpload.Extension.ToLower());
byteArrayContent.Headers.ContentLength = rawBytes.LongLength;

var result = httpClient.PostAsync(this._config.server + „/“ + path, byteArrayContent).Result;
}

Oben der Code; ist so nicht ausführbar sollte aber in etwa das Prinzip zeigen. Letztlich wird das Image als binary gesendet. mediaUpload ist eine eigene Class. 

LG

Bei mir kam der Fehler ‘All provided media types are unsupported.’, wenn der Accept Header nicht gesetzt war. Weiß der Geier warum man das muss.

 'Accept' =\> 'application/json',

Vielen Dank - funktioniert :slight_smile: