Saltar al contenido

Codificar un FileStream a base64 con C#

Recabamos en todo el mundo on line para de esta forma traerte la respuesta para tu problema, si tienes alguna difcultad puedes dejarnos la inquietud y responderemos con mucho gusto.

Solución:

Una fácil como método de extensión.

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

Cuando se trata de transmisiones grandes, como un archivo de más de 4 GB, no desea cargar el archivo en la memoria (como Byte[]) porque no solo es muy lento, sino que también puede provocar un bloqueo, ya que incluso en los procesos de 64 bits un Byte[] no puede superar los 2 GB (o 4 GB con gcAllowVeryLargeObjects).

Afortunadamente, hay un buen ayudante en .NET llamado ToBase64Transform que procesa un flujo en fragmentos. Por alguna razón, Microsoft lo puso en System.Security.Cryptography y se implementa ICryptoTransform (para usar con CryptoStream), pero ignore eso (“una rosa con cualquier otro nombre…”) solo porque no está realizando ninguna tarea criptográfica.

lo usas con CryptoStream al igual que:

using System.Security.Cryptography;
using System.IO;

//

using( FileStream   inputFile    = new FileStream( @"C:VeryLargeFile.bin", FileMode.Open, FileAccess.Read, FileShare.None, bufferSize: 1024 * 1024, useAsync: true ) ) // When using `useAsync: true` you get better performance with buffers much larger than the default 4096 bytes.
using( CryptoStream base64Stream = new CryptoStream( inputFile, new ToBase64Transform(), CryptoStreamMode.Read ) )
using( FileStream   outputFile   = new FileStream( @"C:VeryLargeBase64File.txt", FileMode.CreateNew, FileAccess.Write, FileShare.None, bufferSize: 1024 * 1024, useAsync: true ) )

    await base64Stream.CopyToAsync( outputFile ).ConfigureAwait(false);

puedes intentar algo me gusta ese:

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

Recuerda algo, que te permitimos parafrasear tu experiencia si diste con el hallazgo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *