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.