背景
- 由于业务的特性,导致需要一次给接口传40M的报文,但是由于后端网关平台的限制,报文限制在了10M,因此将这么大的报文传给后端,后端是接收不到的。
- 于是决定将入参报文转成一个txt文件,将文件上传到文件中心,然后得到文件中心的url地址,再将这个地址传给后端,后端再去解析这个文件。
使用CompressionStream压缩
- 将入参转成file对象,并生成txt文件
js
params2File(content, fileName, mimeType) {
// 1. 将字符串转换为 Blob 对象
const blob = new Blob([content], { type: mimeType })
// 2. 将 Blob 转换为 File 对象
const file = new File([blob], fileName, { type: mimeType })
return file
}
- 压缩生成的文件
js
async compressFile(file) {
const stream = file.stream()
const compressedStream = stream.pipeThrough(new CompressionStream('gzip'))
const chunks = []
const reader = compressedStream.getReader()
while (true) {
const { done, value } = await reader.read()
if (done) break
chunks.push(value)
}
// 压缩成gzip文件
return new Blob(chunks, { type: 'application/gzip' })
},
blobToFile(blob, fileName) {
return new File([blob], fileName, {
type: blob.type,
lastModified: Date.now(),
})
}
- 函数调用
js
const file = await this.params2File(JSON.stringify(params), '入参.txt', 'text/plain')
const compressedBlob = await this.compressFile(file)
// 生成gzip压缩包
const compressedFile = this.blobToFile(
compressedBlob,
`${file.name}.gz` // 例如:example.txt.gz
)
-
CompressionStream的压缩率还是非常高的,40M的文件可以压缩到2.9M,压缩率在93%
-
文件上传,具体参数根据自己的项目来
js
let formData = new FormData()
formData.append('xxx', 'xx')
formData.append('num', 1)
formData.append('token', 'xxxx')
formData.append('x-uid', 'xxxx')
formData.append('file', compressedFile)
let result = await axios.post('/upload', formData)
使用DecompressionStream解压
- 有压缩当然也有解压
- 在上述我们已经将压缩后的文件上传到服务器了,并且得到了一个url的文件地址,例如:xxx.cos.ap-guangzhou1.myqcloud.com/MAZ_STANDAQ...
- 下载文件并解压
js
async getFile(url) {
const response = await fetch(url)
if (!response.ok) throw new Error('网络请求失败')
const responseData = await this.decompressGzip(response)
},
// 解压 gz 文件
async decompressGzip (response) {
const decompressionStream = new DecompressionStream('gzip')
const decompressedStream = response.body.pipeThrough(decompressionStream)
const result = await new Response(decompressedStream).json()
return result
},
- 解压效率也是很快的一个原始文件压缩前是60M,解压这个文件花费的时间大概在400-800毫秒
- 如果是后端压缩的文件,使用这个api也是能解压的,前提是后端也是使用gzip压缩,如果是zip是解压不了的