2017-04-26 2 views
3

(je l'ai fait des recherches sur toutes les questions similaires que je peux trouver à ce sujet sur Stackoverflow, et aucun d'eux ne me aider à résoudre mon problème)Amazon S3 gif animé - télécharge uniquement première image

je peux télécharger un gif Amazon S3 comme celui-ci, où request.FileBytes est un tableau d'octets:

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

cela fonctionne très bien pour un .jpg, mais pour un .gif animé, seul le 1er cadre du gif est téléchargé (si je télécharger le même gif direct via S3, ça marche bien). Cela doit donc être lié à la façon dont je diffuse ou convertis le fichier, mais je ne suis pas sûr de savoir où trouver le problème.

Je crée request.FileBytes comme suit, où 'imageData' est les données brutes pour l'image (Chrome utilise ces données d'image quand il affiche l'aperçu GIF animé que j'essaye de télécharger sur S3, et il anime bien):

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

Répondre

1

Ce code fonctionne très bien pour moi, peut-être que vous pouvez l'adapter à votre cas d'utilisation. Je télécharger un fichier GIF à partir d'un fichier local et il affiche/fonctionne très bien après le téléchargement:

 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

Ma méthode de SaveAsGif était le problème, la question est donc quelque chose à voir avec le codec. Je peux créer mon request.fileBytes sans utiliser le codec comme ceci et cela fonctionne: