web-dev-qa-db-fra.com

Encoder un FileStream en base64 avec c #

Je sais comment encoder/décoder une chaîne simple à/de base64

Mais comment ferais-je cela si les données ont déjà été écrites dans un FileStream object. Disons que je n'ai accès qu'à l'objet FileStream et non aux données d'origine précédemment stockées. Comment pourrais-je encoder un FileStream en base64 avant de vider le FileStream dans un fichier. 

Ofc je pourrais simplement ouvrir mon fichier et le coder/décoder après avoir écrit le FileStream dans le fichier, mais je voudrais le faire en une seule étape sans effectuer deux opérations de fichier l'une après l'autre. Le fichier pourrait être plus volumineux et il faudrait également prendre deux fois plus de temps pour le charger, le coder et le sauvegarder après une sauvegarde récente. 

Peut-être que quelqu'un d'entre vous connaît une meilleure solution? Puis-je convertir FileStream en chaîne, encoder la chaîne, puis la reconvertir en FileStream par exemple ou que ferais-je et à quoi ressemblerait un tel code? 

20
feedwall

Vous pouvez également encoder des octets en Base64. Comment obtenir cela depuis un flux, voir ici: Comment convertir un flux en octet [] en C #?

Ou je pense qu'il devrait également être possible d'utiliser la méthode .ToString () et de l'encoder.

10
alpham8

Vous pouvez essayer quelque chose comme ça:

    public Stream ConvertToBase64(Stream stream)
    {
        Byte[] inArray = new Byte[(int)stream.Length];
        Char[] outArray = new Char[(int)(stream.Length * 1.34)];
        stream.Read(inArray, 0, (int)stream.Length);
        Convert.ToBase64CharArray(inArray, 0, inArray.Length, outArray, 0);
        return new MemoryStream(Encoding.UTF8.GetBytes(outArray));
    }
15
Jacob

Une méthode simple comme méthode d'extension

public static class Extensions
{
    public static Stream ConvertToBase64(this Stream stream)
    {
        byte[] bytes;
        using (var memoryStream = new MemoryStream())
        {
            stream.CopyTo(memoryStream);
            bytes = memoryStream.ToArray();
        }

        string base64 = Convert.ToBase64String(bytes);
        return new MemoryStream(Encoding.UTF8.GetBytes(base64));
    }
}
13
chris31389

Comme le fichier sera plus volumineux, vous n’avez pas beaucoup de choix quant à la manière de procéder. Vous ne pouvez pas traiter le fichier en place car cela détruirait les informations que vous devez utiliser. Vous avez deux options que je peux voir:

  1. Lire dans le fichier entier, encoder en base64, réécrire les données encodées.
  2. Lisez le fichier en morceaux plus petits et encodez-les au fur et à mesure. Encoder dans un fichier temporaire dans le même répertoire. Lorsque vous avez terminé, supprimez le fichier d'origine et renommez le fichier temporaire.

Bien entendu, l’intérêt des flux est d’éviter ce genre de scénario. Au lieu de créer le contenu et de le ranger dans un flux de fichiers, collez-le dans un flux de mémoire. Encodez ensuite cela et seulement ensuite enregistrez sur le disque.

5
David Heffernan

N'oubliez pas:

stream.Seek(0, SeekOrigin.Begin);

au début de la méthode ... ;-)

0
David