如何在PowerShell中为Base64转换添加压缩功能?
PowerShell实现文件与Base64的无临时文件压缩互转
针对二进制文件(如PDF、图片等),直接基于文本的压缩逻辑会导致文件损坏,以下是适配任意文件类型的无临时文件转换方案,全程通过内存流处理,结合GZip压缩减少Base64的存储体积。
1. 文件 → 压缩 → Base64
该脚本读取文件的原始字节流,通过GZip压缩后直接转换为Base64字符串并保存:
# 输入文件路径 $inputFilePath = "test.pdf" # 输出Base64文件路径 $outputB64Path = "test_compressed.b64" # 读取文件字节,初始化内存流 $fileBytes = [System.IO.File]::ReadAllBytes($inputFilePath) $memoryStream = New-Object System.IO.MemoryStream $gzipStream = New-Object System.IO.Compression.GZipStream($memoryStream, [System.IO.Compression.CompressionMode]::Compress) # 将文件字节写入压缩流 $gzipStream.Write($fileBytes, 0, $fileBytes.Length) $gzipStream.Close() # 将压缩后的字节转Base64并保存 [System.Convert]::ToBase64String($memoryStream.ToArray()) | Out-File -FilePath $outputB64Path -Encoding ASCII $memoryStream.Close()
2. Base64 → 解压 → 文件
该脚本读取Base64字符串,解码为压缩字节流后解压,最终写入目标文件:
# 输入Base64文件路径 $inputB64Path = "test_compressed.b64" # 输出文件路径 $outputFilePath = "test_restored.pdf" # 读取Base64字符串并解码为字节 $b64String = Get-Content -Path $inputB64Path -Raw $compressedBytes = [System.Convert]::FromBase64String($b64String) # 初始化内存流写入压缩字节 $memoryStream = New-Object System.IO.MemoryStream $memoryStream.Write($compressedBytes, 0, $compressedBytes.Length) $memoryStream.Seek(0, [System.IO.SeekOrigin]::Begin) | Out-Null # 解压字节流并读取原始文件字节 $gzipStream = New-Object System.IO.Compression.GZipStream($memoryStream, [System.IO.Compression.CompressionMode]::Decompress) $outputStream = New-Object System.IO.MemoryStream $gzipStream.CopyTo($outputStream) $gzipStream.Close() # 将解压后的字节写入文件 [System.IO.File]::WriteAllBytes($outputFilePath, $outputStream.ToArray()) $memoryStream.Close() $outputStream.Close()
关键说明
- 全程使用
MemoryStream处理数据,无需创建任何临时文件 - 直接操作字节流而非文本流,避免二进制文件因编码转换损坏
- 使用GZip压缩可有效降低Base64字符串的长度,对比未压缩的Base64通常能节省30%-70%的存储空间(取决于文件类型)
内容的提问来源于stack exchange,提问作者PlayLORD-SysOp
相关产品推荐
相关产品推荐

