【发布时间】:2020-11-25 21:48:07
【问题描述】:
我正在尝试为 gzip 压缩文件,但是在压缩后我需要获取生成的 gzip 字节以生成 base64 字符串。
但是,当我尝试将 gzip 流复制到内存流时,它会引发异常 Stream 不支持读取。
我找不到解决此问题的方法,有人可以帮助我吗?
按照下面的代码:
public static async Task<Tuple<bool, string, string>> CompressToGzipBase64(this IFormFile formFile, Language language)
{
var filePath = formFile.FileName + ".gz";
try
{
await using var gzipFileStream = File.OpenWrite(formFile.FileName + ".gz");
await using var gZipStream = new GZipStream(gzipFileStream, CompressionMode.Compress);
await formFile.CopyToAsync(gZipStream);
var bytesOfFile = await ConverteStreamToByteArray(gZipStream);
var fileInBase64 = Convert.ToBase64String(bytesOfFile);
File.Delete(filePath);
return new Tuple<bool, string, string>(true, fileInBase64, string.Empty);
}
catch (Exception e)
{
File.Delete(filePath);
return language switch
{
Language.PtBr => new Tuple<bool, string, string>(false, string.Empty,
"Ocorreu um erro durante a conversão do arquivo para o formato Gzip. Por favor tente a operação novamente!"),
Language.EnUs => new Tuple<bool, string, string>(false, string.Empty,
"An error occurred while converting the file to Gzip format. Please try the operation again!"),
Language.EsEs => new Tuple<bool, string, string>(false, string.Empty,
"Se produjo un error al convertir el archivo a formato Gzip. ¡Intente la operación nuevamente!"),
_ => new Tuple<bool, string, string>(false, string.Empty, string.Empty)
};
}
}
private static async Task<byte[]> ConverteStreamToByteArray(GZipStream stream)
{
await using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
return ms.ToArray();
}
【问题讨论】: