Bilder verschwinden zufällig, Upload über API

Moin zusammen,

ich habe ein Anliegen bei dem wir so langsam echt am verzweifeln sind.
Wir haben eine Schnittstelle zum Synchronisieren von Artikeldaten, Bildern usw. zwischen ERP Systemen und Shopware.
Inzwischen melden sich aber immer mehr Kunden oder deren Shopware Agenturen bei uns uns sagen, dass beim Upload der Artikeldaten zufällig Bilder verschwinden würden.
Also das muss nicht mal für den Artikel der hochgeladen wurde der Fall sein es sind wohl laut Aussagen der Kunden auch schon Bilder in den Einkaufswelten und Blogs verschwunden ( Diese Daten werden manuell im Backend gepflegt und haben nichts mit unserer Schnittstelle zu tun ).
Im Frontend sind die Bilder natürlich nicht mehr sichtbar, im Backend zeigt sich der Effekt aber immer so, dass bei Artikeln die Zuordnungen noch vorhanden sind aber die Medien einfach weg sind. (Leere Kästen an der Stelle wo normal die Bilder beim Artikel angezeigt werden)

Wir können uns dies aber wie gesagt absolut nicht erklären, es gibt auch keine Beweise ( Logs oder ähnliches ), dass wir irgendwie explizit Bilder löschen. Es wird einfach davon ausgegangen, dass es an unserer Schnittstelle liegen muss und nun versuchen wir eben herauszufinden wie das passieren kann.

Zu unserem Vorgehen:
Zum anlegen der Artikel ist der Upload in 4 Schritte gegliedert.

  1. Artikeldaten ( Artikelanlage, Kategoriezuweisung, Texte, Übersetzungen, Eigenschaften usw. )
  2. Preise
  3. Lagerbestände
  4. Medien

D.h. nur wenn man explizit den Medienupload ausführt werden Bilder berührt uns hat aber schon ein Kunde gemeldet, dass er nach dem Upload der Artikeldaten beim Artikel keine Bilder mehr hatte, was wir eigentlich für absolut ausgeschlossen halten.
Es war jetzt auch nicht so, dass der Kunde den Artikel angeschaut hat, alles in Ordnung war und nach dem Upload hatte der Artikel keine Bilder mehr. Der Kunde hatte am Morgen einen Text geändert und daraufhin die Artikeldaten aktualisiert später am Tag hat er dann festgestellt, dass die Bilder weg sind.
Wir haben uns daraufhin beim Kunden gemeldet und in einer Fernwartung die Uploads angeschaut und Tests gemacht, die Bilder wurden korrekt wieder hochgeladen und wir konnten den Effekt nicht mehr reproduzieren.

Ich habe von diesem Kunden als wir den Upload gemacht haben einen Ausschnitt aus dem Log, dort sieht man ganz genau unser Vorgehen beim Bildupload.

  1. Wir laden ein leeres images und downloads Array zum Artikel damit die Verknüpfungen zu existierenden Bildern und sonstigen Medien entfernt werden.
  2. Wir löschen per DELETE über die MedienIds die entsprechenden Medien falls zuvor welche vorhanden waren.
  3. Die neuen Medien werden als Base64 an Shopware gesendet und damit in der Mediengallerie angelegt, die MedienId aus dem Response der API speichern wir in der DB mit einem Verweis auf den Artikel.
  4. Wir senden ein images und downloads Array mit den entsprechenden MedienIds an Shopware um die Medien mit dem Artikel zu verknüpfen.

 In dem Screenshot aus dem Log sieht man ziemlich genau diesen Ablauf mit ein paar besonderheiten.
Im oberen Bereich wird nach dem Delete ein 2. mal leere Arrays gesendet da der Kunde von seinem Rechner kein Zugriff auf die Bilder hatte. 
Danach folgt ein Artikeldatenupload, ein Preisupload und ein Lagerupload.
Anschließend hat ein Kollege der Zugriff auf die Bilder hat diese hochgeladen ( die letzten 8 Zeilen ), hier gibt es kein Delete da zu diesem Zeitpunkt keine im Shop waren.

Wir senden aber wie gesagt immer im 1. Schritt die leeren Arrays wodurch die Verknüpfungen zwischen dem Artikel und den Medien entfernt werden, daher ist es noch verwunderlicher, dass bei den zufällig verschwundenen Bildern die Verknüpfungen mit dem Artikel noch existieren.

Wir haben in unserem Demoshop schon Stundenlang Artikeluploads gemacht und konnten den Effekt absolut nicht reproduzieren, wir haben auch schon mit dem Shopbetreuer gemeinsam 2 Stunden Uploads gemacht während er sich die Logs angeschaut hat, nichts zu finden.

Wir haben früher die Bilder auf einen FTP Server hochgeladen und dann die URL an Shopware übergeben anstelle des Base64 aber daran kann es doch sicher nicht liegen.

Es gab auch schon die Idee, dass wir evtl. MedienIds vertauschen oder diese bei uns in der DB nicht sauber gelöscht werden und anschließend später mit einem DELETE erneut gesendet werden was dazu führt, dass wir andere Medien löschen würden.
Nach einigen Kontrollen halte ich aber auch das für ausgeschlossen da Shopware immer neue MedienIds vergibt.
Also nehmen wir an meine letzten MedienIds sind 780, 781 und 782. Dann lösche ich diese Bilder, die MedienIds 780, 781, 782 werden im Shopware frei. Lege ich aber ein neues Bild an, bekommt dies die MedienId 783, die frei gewordenen Ids werden also nicht mehr verwendet.

Sorry für den langen Text aber ich dachte es wäre wichtig die Umstände und unsere bisherigen Versuche und Erkenntnisse zu Schildern.

Hat irgend jemand eine Idee ?
Egal was, für jede Idee sind wir dankbar, es muss auch nichts mit der API oder den Calls zu tun haben, wie gesagt liegt es ja vielleicht nicht an uns sondern wird durch irgend einen anderen Effekt provoziert. 

Vielen Dank für eure Zeit.

Beste Grüße,
Simon

Ich hatte mal den gleichen Effekt. Ich hatte der media-Resource beim Löschen versehentlich die id statt der mediaId des Bildes (https://developers.shopware.com/developers-guide/rest-api/models/#image) übergeben. Damit habe ich beim Löschen von Bildern immer irgendwelche Bilder von anderen Artikeln gelöscht.

Nachtrag: Das mit den leeren Arrays kansst Du Dir eigentlich auch sparen, wenn Du __options_downloads => replace bzw. __options_images => replace verwendest.

Danke für die Idee, das kann es bei uns aber „leider“ nicht sein, da dann grundlegend immer etwas schief gehen würde und nur einzelne Bilder verschwinden würden.
Wenn dann war es aber immer so, dass zu einem Artikel komplett alle Bilder weg waren, auch mal 6 oder mehr.
Und wir müssten das Problem bei uns reproduzieren können wenn wir grundsätzlich eine falsche Id verwenden würden.

Danke auch für den Tipp mit dem Replace, nehme ich mal mit auf und schaue es mir bei Gelegenheit an, wird nichts am Problem ändern aber würde uns einen Call sparen was auch sehr gut ist. :slight_smile:

Vielen Dank nochmal, das Problem besteht weiterhin und wir sind noch nicht weiter, falls also noch jemand eine Idee hat, immer her damit.

Beste Grüße,
Simon

Mal ne doofe Frage: Warum übergibst Du die Base64-kodierten Bilder nicht direkt in der images=>link-Eigenschaft über die articles-API (dann natürlich mit __options_images => replace)? 

Hallo Marcus, 

an diese Option hatte ich noch nicht gedacht, wir haben es damals bei einer anderen Schnittstelle vor Jahren so gemacht wie jetzt, da haben wir allerdings die Bilder eben erst über einen FTP Server hochgeladen und dann per URL an Shopware übergeben.
Daher haben wir es in der neuen Schnittstelle nun auch so implementiert ( bis auf das mit dem FTP ).
Mir war nicht bewusst, dass es so viele Möglichkeiten gibt die Bilder beim Artikel zu hinterlegen aber wenn ich es richtig verstehe, wäre dadurch ja das komplette speichern der MediaIds hinfällig, hört sich gut an. Werde es mir mal genauere anschauen und testen und dann evtl. umstellen.
Vielleicht hat dann damit auch unser Problem erledigt woran auch immer es liegen mag.

Vielen Dank für den Tipp.

Beste Grüße, Simon

Nachtrag:
Habe es jetzt mal getestet, funktioniert soweit gut.
Nur 2 Sachen:

  1. Die Bilder in der Mediengallerie werden dadurch natürlich immer und immer wieder angelegt, ich schätze mal diese werden nicht gelöscht da die Bilder ja theoretisch noch anderweitig verwendet werden könnten. Wir kommen also nicht drum rum für jede MediaId ein Delete zu senden aber die könnten wir in dem Fall ja vorher über ein GET auf den Artikel abrufen.

  2. Bei PDFs haben wir durch das Base64 ein Problem seit der Version 5.6.1 sie werden richtig verknüpft, im Backend sieht alles gut aus aber im Frontend sind manche PDFs doppelt verlinkt. Das ist reproduzierbar und passiert immer bei den gleichen PDFs also gehe ich davon aus, dass Shopware mit irgendwas in dem generierten Base64 ein Problem hat denn wenn man das gleiche PDF per Hand hochlädt und verknüpft, die Datei also einen relativ ordentlichen Namen hat, dann passiert es nicht.
    Gibt es eine möglichkeit über diesen Weg einen Namen für die Datei in der Mediengallery vorzugeben ?
    Ist auch sehr unschön für den Download da die Kunden sich dann eine Datei herunterladen deren Dateiname ein kryptisches ewig langes kauderwelsch ist.

zu 1. Genauso mache ich das auch bei uns. Ich frage den Artikel per GET ab (muss ich eh, um zu wissen, ob er neu angelegt oder geupdated werden muss), speichere mir die alte image-Collection in einer Variable, erzeuge eine neue Image-Collection, update den Artikel und lösche dann die alten Bilder vom Server (über die mediaId :-)).

zu 2. Genau vor dem gleichen Problem stehe ich auch… Noch keine Lösung dafür gefunden.