2009-06-12 12 views
7

Estoy intentando subir imágenes a un sitio de Magento usando la API SOAP con C#.Carga de imágenes a través de la API SOAP de Magento

Esto es lo que tengo hasta ahora, pero no está funcionando, no se lanzan excepciones ni nada, pero cuando voy y miro en el sitio la imagen está en blanco.

¿Necesito hacer el Base64Encode? Solo probé esto porque el ejemplo PHP de this hace algo similar. Si lo intento sin obtener una excepción SOAP con el mensaje de error de "Solicitud incorrecta".

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"); 

Respuesta

14

Esto me llevaba días para trabajar .... esto es cómo hacerlo

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 funcionó muy bien. Solo una pregunta, cuando tengo varias imágenes y tengo un bucle foreach envuelto alrededor de todo el código, carga el número correcto si las imágenes pero siempre son solo una imagen. ¿Debo eliminar el MemoryStream después de cada irritación del ciclo? ¡Gracias! –

+0

Gracias por esto. Acabo de comenzar un proyecto para integrar un sistema existente en Magento y la documentación es prácticamente inexistente. Esto fue EXACTAMENTE lo que necesitaba. – Archer

+0

Si pudiera darte + 10^19, lo haría. –

2

Parece que Dan y yo se han confundido en el mismo número en los mismos días, ¡y obtenemos la misma solución!

Estoy usando XML-RPC y la API de Magento. Escribí este código como parte de una clase más grande que leía los datos de imagen de un archivo y los hace compatibles con la API de Magento.

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; 
     } 
    } 

La cosa muy importante es que el "contenido" debe ser de tipo cadena y debe ser obtenida de bytes [] a través de la llamada de la función del sistema Convert.ToBase64String(...).

Con respecto al tipo MIME de la imagen, solo "gif", "jpg" y "png" son compatibles con cuando descubrí buscando dentro del código API de Magento.

Cuestiones relacionadas