2009-06-12 8 views
7

Ich versuche, Bilder mit der SOAP-API mit C# auf eine Magento-Site hochzuladen.Hochladen von Bildern über die Magento SOAP-API

Dies ist, was ich bisher habe, aber es funktioniert nicht, keine Ausnahmen werden geworfen oder irgendetwas anderes, aber wenn ich gehe und auf der Website das Bild leer ist.

Muss ich den Base64Encode tun? Ich habe das wirklich nur probiert, weil this PHP-Beispiel etwas Ähnliches tut. Wenn ich es ohne versuche, bekomme ich eine SOAP-Ausnahme mit der Fehlermeldung "Bad Request".

FileStream fs = File.OpenRead(@"c:\1.jpg"); 
    StreamReader sr = new StreamReader(fs); 

    string fileConent = sr.ReadToEnd(); 

    byte[] encbuff = Encoding.UTF8.GetBytes(fileConent); 
    string enc = Convert.ToBase64String(encbuff); 

    var imageEntity = new catalogProductImageFileEntity(); 
    imageEntity.content = enc; 
    imageEntity.mime = "image/jpeg"; 
    sr.Close(); 
    fs.Close(); 

    var entityP = new catalogProductAttributeMediaCreateEntity(); 
    entityP.file = imageEntity; 
    entityP.types = new[] {"image", "small_image", "thumbnail"}; 
    entityP.position = "0"; 
    entityP.exclude = "0"; 

    _m.catalogProductAttributeMediaCreate(MageSessionProvider.GetSession(), SKU, entityP, "default"); 

Antwort

14

Das hat mich AUSFLüGE zu arbeiten .... das ist, wie es

public void UploadProductImage(string SKU, string path) 
     { 
      var imageStream = new MemoryStream(); 

      using (var i = Image.FromFile(@"c:\ProductImages\" + path)) 
      { 
         i.Save(imageStream, ImageFormat.Jpeg); 
      } 
       byte[] encbuff = imageStream.ToArray(); 

      string enc = Convert.ToBase64String(encbuff,0 , encbuff.Length); 


      var imageEntity = new catalogProductImageFileEntity(); 
      imageEntity.content = enc; 
      imageEntity.mime = "image/jpeg"; 
      imageStream.Close(); 


      var entityP = new catalogProductAttributeMediaCreateEntity(); 
      entityP.file = imageEntity; 
      entityP.types = new[] {"image", "small_image", "thumbnail"}; 
      entityP.position = "0"; 
      entityP.exclude = "0"; 

      _m.catalogProductAttributeMediaCreate(MageSessionProvider.GetSession(), SKU, entityP, "default"); 
      Console.WriteLine("Image Uploaded"); 
     } 
+0

+1 hat super funktioniert. Nur eine Frage: Wenn ich mehrere Bilder habe und eine foreach-Schleife um den gesamten Code gewickelt habe, wird die richtige Anzahl von Bildern hochgeladen, aber sie sind immer nur ein Bild. Muss ich den MemoryStream nach jeder Reizung der Schleife entsorgen? Vielen Dank! –

+0

Danke dafür. Ich habe gerade ein Projekt gestartet, um ein bestehendes System in Magento zu integrieren, und die Dokumentation ist praktisch nicht vorhanden. Das war genau das, was ich brauchte. – Archer

+0

Wenn ich Ihnen + 10^19 hätte geben können, würde ich. –

2

Es scheint zu tun, dass Dan und ich habe in der gleichen Ausgabe an den gleichen Tagen verwirrt worden, und wir bekommen die selbe Lösung!

Ich verwende XML-RPC und die Magento API. Ich habe diesen Code als Teil einer größeren Klasse geschrieben, die die Bilddaten aus einer Datei liest und sie mit der Magento API kompatibel macht.

internal void readFromFile(string fullImpgPath) 
    { 
     m_file.content = System.Convert.ToBase64String(System.IO.File.ReadAllBytes(fullImpgPath)); 
     string ext = System.IO.Path.GetExtension(fullImpgPath).ToLower(); 
     switch (ext) 
     { 
      case ".gif": 
       m_file.mime = "image/gif"; 
       break; 

      case ".jpg": 
      case ".jpeg": 
       m_file.mime = "image/jpeg"; 
       break; 

      case ".png": 
       m_file.mime = "image/png"; 
       break; 

      case ".bmp": 
       m_file.mime = "image/bmp"; 
       break; 

      case ".tif": 
      case ".tiff": 
       m_file.mime = "image/tiff"; 
       break; 

      default: 
       m_file.mime = "application/octet-stream"; 
       break; 
     } 
    } 

Die sehr wichtige Sache ist, dass der „Inhalt“ vom Typ String sein muss und muß von Bytes [] durch den Aufruf der Systemfunktion Convert.ToBase64String(...) erhalten werden.

In Bezug auf die MIME Art des Bildes, nur "gif", "jpg" und "png" werden unterstützt, wie ich entdeckte in den Magento API-Code suchen.

Verwandte Themen