2017-04-26 10 views
3

(私はStackOverflowの上でこれについて見つけることができるすべての同様の質問を調査してきたが、それらのどれも私の問題を解決するために私を助けていない)Amazon S3のアニメーションGIF - のみアップロード最初のフレーム

私はGIF画像をアップロードすることができますrequest.FileBytesはバイト配列である。このようなアマゾンS3、:

public bool UploadFile(CdnFile request) 
{ 
    var transfer = new TransferUtility(CdnConfig.AccessKey, CdnConfig.SecretKey, ep); 
    var uploadRequest = new TransferUtilityUploadRequest(); 
    uploadRequest.InputStream = new MemoryStream(request.FileBytes); 

    var result = transfer.BeginUpload(s3Req2, cb, null); 
    transfer.EndUpload(result); 
} 

これは、.jpgのために正常に動作します、しかし、アニメーション.GIFために、GIFの唯一の第一フレームがアップロードされた(私がアップロードした場合S3経由で直接同じgif、それはうまく動作します)。だから私はストリーミングやファイルを変換する方法と関係があるが、問題がどこで発生するのかを知る方法がわからない。

次のようにrequest.FileBytesを作成します。ここで 'imageData'は画像の生データです(ChromeはS3にアップロードしようとしているアニメーションgifプレビューを表示するときにこの画像データを使用し、 ):

var data = Convert.FromBase64String(imageData); 
var img = new Bitmap(new MemoryStream(data)); 
fileBytes = img.SaveAsGif(); 

public static byte[] SaveAsGif(this Image img, long quality = 100) 
{ 
    ImageCodecInfo gifEncoder = GetEncoder(ImageFormat.Gif); 

    Encoder myEncoder = Encoder.Quality; 

    EncoderParameters myEncoderParameters = new EncoderParameters(1); 

    EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, quality); 
    myEncoderParameters.Param[0] = myEncoderParameter; 

    using (MemoryStream msGif = new MemoryStream()) 
    { 
     img.Save(msGif, gifEncoder, myEncoderParameters); 
     return msGif.ToArray(); 
    } 
} 

答えて

1

このコードは、おそらくあなたは、あなたのユースケースのためにそれを適応させることができ、私のために正常に動作します。私は、ローカルファイルからGIFをアップロードし、それを表示する/アップロードした後だけで正常に動作:

 using (var client = new AmazonS3Client("AKIAI5ZL44fake4442COJA", "4sYnPuA1zMkhghghghghTpX4F5/FUXGDiAKm", RegionEndpoint.USEast1)) 
     { 
      var request = new PutObjectRequest 
      { 
       BucketName = "bucketname", 
       ContentType = "image/gif", 
       Key = "test.gif", 
       FilePath = @"c:\dev\006.gif" 
      }; 
      var response = client.PutObject(request); 
     } 
0

マイSaveAsGif方法が問題だったので、問題は、コーデックとは何かです。私はこのようなコーデックを使用せずに私のrequest.fileBytesを作成することができ、動作します:

var imageStream = new MemoryStream(data); 
fileBytes = imageStream.ToArray(); 
関連する問題