Image Upload über REST API

Hallo, ich versuche derzeit einen ImageUpload über die REST API von SW 6. An sich halte ich mich an die Anleitung im Link:

https://forum.shopware.com/discussion/61982/produkt-bilder-ueber-api-hochladen jedoch bekomme ich immer die Meldung malformed url.

Unverständlich ist für mich auch, dass die User im Link nur Bilder von Websiten nutzen. Ich möchte allerdings Medien von meinem eigenen PC hochladen und im Nachgang an Produkte heften.

Ist das genauso möglich?

Du kannst nicht einfach einen Ordner deiner Festplatte in der URL angeben. Das Bild muss direkt als binärer Datenstream in einem Post Request geschickt werden.

Hey Thomas vielen Dank für dein Feedback. Das habe ich jetzt soweit begriffen.

Hast du eventuell ein Beispiel wie das ganze dann binär im Post Request und Payload aussieht?

Tuts Python? Da könnte ich was zusammensuchen!

Okay klar

Es ist alles ganz einfach *hust* *hust*

import os
import uuid
import json
import requests

url = 'http://xxx'
userid = 'xxx'
userpass = 'yyy'

##### LOGIN #####
requrl = url + '/api/oauth/token'
payload = {'client_id': 'administration', 'grant_type': 'password', 'scopes': 'write', 'username': userid, 'password': userpass}
r = requests.post(requrl, json=payload)
r = json.loads(r.text)
token = r['access_token']

filename = "c:\\ente.jpg"
mediaFolderID = "2376786d815f428daa9efbed4d455c3e"

##### PREPARE NEW PICTURE ID #####
requrl = url + "/api/v3/media?_response=basic"
payload = {"mediaFolderId": mediaFolderID}
headers = {"Accept": "application/json", "Authorization" : "Bearer " + token}
r = requests.post(requrl, json=payload, headers=headers)
r = json.loads(r.text)
mediaID = r["data"]["_uniqueIdentifier"]

##### PUT NEW PICTURE IN THIS ID #####
requrl = url + "/api/v3/_action/media/" + mediaID + "/upload" + "?_response=basic"
requrl += "&extension=" + os.path.split(filename)[-1].split(".")[-1]
requrl += "&fileName=" + os.path.split(filename)[-1].split(".")[0]
headers = {"Accept": "application/json", "Authorization" : "Bearer " + token}
with open(filename, "rb") as f:
    r = requests.post(requrl, headers=headers, data=f)

##### PATCH PRODUCT PICTURE #####
requrl = url + "/api/v3/product/" + prodid + "?_response=basic"
headers = {"Accept": "application/json", "Authorization" : "Bearer " + token}
payload = {"media": [{"mediaId": mediaID, "position": 0}]}
r = requests.patch(requrl, json=payload, headers=headers)
r = json.loads(r.text)

##### GET MEDIA ID OF NEW PRODUCT PICTURE #####
requrl = url + "/api/v3/product/" + prodid + "/media" + "?_response=basic"
headers = {"Accept": "application/json", "Authorization" : "Bearer " + token}
r = requests.get(requrl, json=payload, headers=headers)
r = json.loads(r.text)
newMediaID = r["data"][0]["_uniqueIdentifier"]

##### PATCH PRODUCT PICTURE AS COVER #####
requrl = url + "/api/v3/product/" + prodid + "?_response=basic"
headers = {"Accept": "application/json", "Authorization" : "Bearer " + token}
payload = {"coverId": newMediaID}
r = requests.patch(requrl, json=payload, headers=headers)
r = json.loads(r.text)

 

Hallo Thomas,

 

danke für das Beispiel. Wen ich das ganze so ausführe erhalten ich ein leeres Bild mit Namen im Shop. Ich verstehe noch nicht so ganz an welcher Stelle du das Bild als binären Datenstrom an den Post Request übergibst.

hier:

with open(filename, "rb") as f:
    r = requests.post(requrl, headers=headers, data=f)

f ist das bild.

Weiter oben würde dateiname gesetzt. Evtl. ist der bei dir nicht richtig gesetzt?

Hast du evtl. den falschen Endpunkt? In meiner URL die ich ansteuere kommt kein ‘_action’ vor und auch die Meldung “you must provide a valid url” bekomme ich nicht obwohl ich garkeine URL angebe!

##### PUT NEW PICTURE IN THIS ID #####
requrl = url + "/api/v3/_action/media/" + mediaID + "/upload" + "?_response=basic"
requrl += "&extension=" + os.path.split(filename)[-1].split(".")[-1]
requrl += "&fileName=" + os.path.split(filename)[-1].split(".")[0]
headers = {"Accept": "application/json", "Authorization" : "Bearer " + token}
with open(filename, "rb") as f:
    r = requests.post(requrl, headers=headers, data=f)

 

 

Schreibst du hier nicht auf ‚_action‘ in deine URL?

nope, meine url ist:

url = 'https://www.meinshop.de'

 

Moment ja das habe ich ja schon verstanden aber beim Bilderupload hängst du an die URL doch das /api/v3/_action/media… oder nicht?

Du schreibst doch in der Zeile:

requrl = url + "/api/v3/_action/media/" + mediaID + "/upload" + "?_response=basic"

 

übersetzt also: requrl = https://www.meinshop.de/api/v3/_action/media... oder muss ich das _action durch etwas ersetzen?

oh ja… sorry, dann bin ich in der zeile verrutscht. Bildhochladen ist ja auch ned unbedingt einfach bei Shopware :frowning:

Haha kein Problem. Ich bin schon so sehr froh, dass du so sehr versuchst mir zu helfen.

Leider bekomme ich dennoch die Fehlermeldung. Hast du noch eine Idee woran das liegen könnte?

Du kannst mal versuchen den Request mit Wireshark mitzuschneiden. Solangs nicht über https geht siehst du dann alles was nötig ist.

Hmm leider ist es https.

 

Hat dein Script wie du es oben geschrieben hast funktioniert?

klar! Sonst hätt ich es nicht gepostet.

Funktioniert problemlos und ist häufig im Einsatz.

Könntest du mir mal die Ausgabe von f zeigen?

Müsste das hier sein:

 

Hast du die

mediaFolderID

richtig?