2009-06-12 19 views
7

C#でSOAP APIを使用してMagentoサイトに画像をアップロードしようとしています。Magento SOAP API経由で画像をアップロードする

これは私がこれまで行ってきたことですが、動作していない、例外がスローされたり、何かが起こったりします。

Base64Encodeを実行する必要はありますか?私は実際にこれを試しましたthis PHPの例は何か似ています。私がそれを試さなければ、 "Bad Request"のエラーメッセージを持つSOAP例外が発生します。

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

答えて

14

これが動作するように日かかった....これはそれを

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はうまく機能しました。ただ1つの質問です。複数の画像があり、コード全体を囲むforeachループがあると、画像が正しい場合はアップロードされますが、常に1つの画像になります。ループの苛立ちの後にMemoryStreamを処分する必要はありますか?ありがとう! –

+0

ありがとうございます。私はちょうどMagentoに既存のシステムを統合するためのプロジェクトを始めました、そして、ドキュメンテーションは事実上存在しません。これは私が必要としていたものでした。 – Archer

+0

もし私があなたに+ 10^19を与えることができたら、私はそうするでしょう。 –

2

を行う方法であることは 、ダンと私は同じ日に同じ問題に困惑しているようです私たちは同じソリューションを手に入れます!

私はXML-RPCとMagento APIを使用しています。私はこのコードをファイルから画像データを読み込んでMagento APIと互換性のある大きなクラスの一部として書きました。

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

非常に重要なことは、「コンテンツ」とは、文字列型でなければならず、 は、システム機能Convert.ToBase64String(...)の呼び出しを通じてバイト[]から取得しなければならないということです。

画像のMIMEのタイプについては、Magento APIコードを調べたところで、「gif」、「jpg」、「png」のみがサポートされています。

関連する問題