You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS端React Native/Swift实现gzip解压至Documents目录方案咨询

React Native 解压Gzip文件实现方案

下面提供三种可行的实现方案,均能实现点击Gzip文件后将内容解压到同目录同名文件夹的效果:

方案一:纯JS层实现(使用pako库)

pako是纯JavaScript的压缩/解压库,无需原生依赖,适配React Native环境。

步骤:

  1. 安装依赖
npm install pako
  1. 实现解压逻辑
import RNFS from 'react-native-fs';
import pako from 'pako';

const unzipGzipFile = async (gzipFilePath) => {
  // 解析路径:获取父目录、文件名(去掉.gz后缀)
  const parentDir = RNFS.dirname(gzipFilePath);
  const baseFileName = RNFS.basename(gzipFilePath, '.gz');
  // 目标文件夹路径(同目录下的同名文件夹)
  const targetDir = `${parentDir}/${baseFileName}`;
  // 解压后文件的路径(文件夹内的同名文件)
  const targetFilePath = `${targetDir}/${baseFileName}`;

  // 创建目标文件夹
  await RNFS.mkdir(targetDir);

  // 读取Gzip文件为base64格式
  const gzipBase64 = await RNFS.readFile(gzipFilePath, 'base64');
  // 转换为Uint8Array供pako处理
  const uint8Data = Uint8Array.from(atob(gzipBase64), char => char.charCodeAt(0));

  try {
    // 解压数据
    const decompressedData = pako.inflate(uint8Data);
    // 转换回base64写入文件
    const decompressedBase64 = btoa(String.fromCharCode(...decompressedData));
    await RNFS.writeFile(targetFilePath, decompressedBase64, 'base64');
    
    return targetFilePath;
  } catch (err) {
    console.error('Gzip解压失败:', err);
    throw err;
  }
};

方案二:使用React Native专用Gzip库

react-native-gzip是专为RN封装的原生Gzip处理库,性能比纯JS方案更优。

步骤:

  1. 安装依赖
npm install react-native-gzip
# 若RN版本<0.60,需手动执行链接:react-native link react-native-gzip
  1. 实现解压逻辑
import RNFS from 'react-native-fs';
import { uncompress } from 'react-native-gzip';

const unzipWithRNLib = async (gzipFilePath) => {
  const parentDir = RNFS.dirname(gzipFilePath);
  const baseFileName = RNFS.basename(gzipFilePath, '.gz');
  const targetDir = `${parentDir}/${baseFileName}`;
  const targetFilePath = `${targetDir}/${baseFileName}`;

  await RNFS.mkdir(targetDir);

  // 读取Gzip文件为base64
  const gzipBase64 = await RNFS.readFile(gzipFilePath, 'base64');
  // 调用库的解压方法
  const decompressedBase64 = await uncompress(gzipBase64);
  // 写入目标文件
  await RNFS.writeFile(targetFilePath, decompressedBase64, 'base64');

  return targetFilePath;
};

方案三:原生Swift实现自定义模块

如果你倾向于原生实现,可通过RN原生模块完成,解决你之前遇到的NSData.decompress()仅返回数据的问题——只需将解压后的数据写入目标文件夹即可。

步骤:

  1. 创建Swift原生模块文件(GzipUnzipper.swift)
import Foundation
import React

@objc(GzipUnzipper)
class GzipUnzipper: NSObject, RCTBridgeModule {
  // 模块名称,RN侧通过此名称调用
  static func moduleName() -> String! {
    return "GzipUnzipper"
  }

  // 标记是否需要在主线程初始化
  static func requiresMainQueueSetup() -> Bool {
    return true
  }

  // 暴露给RN的解压方法
  @objc func unzipGzipFile(_ filePath: String, resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
    let fileURL = URL(fileURLWithPath: filePath)
    let parentDirURL = fileURL.deletingLastPathComponent()
    let baseFileName = fileURL.deletingPathExtension().lastPathComponent
    
    // 目标文件夹和文件路径
    let targetDirURL = parentDirURL.appendingPathComponent(baseFileName)
    let targetFileURL = targetDirURL.appendingPathComponent(baseFileName)

    do {
      // 创建目标文件夹
      try FileManager.default.createDirectory(at: targetDirURL, withIntermediateDirectories: true)
      
      // 读取Gzip文件数据
      let gzipData = try Data(contentsOf: fileURL)
      
      // 解压数据(iOS 13+支持Data.decompress(),若兼容低版本可引入第三方Gzip库如Zlib)
      guard let decompressedData = try gzipData.decompressed() else {
        reject("DECOMPRESS_FAILED", "Gzip数据解压失败", nil)
        return
      }
      
      // 将解压后的数据写入目标文件
      try decompressedData.write(to: targetFileURL)
      
      // 返回解压后的文件路径给RN
      resolve(targetFileURL.path)
    } catch {
      reject("UNZIP_ERROR", error.localizedDescription, error)
    }
  }
}
  1. 在RN桥接文件(YourProject-Bridging-Header.h)中添加引用
#import <React/RCTBridgeModule.h>
  1. RN侧调用原生模块
import { NativeModules } from 'react-native';
const { GzipUnzipper } = NativeModules;

const unzipWithNative = async (gzipFilePath) => {
  try {
    const resultPath = await GzipUnzipper.unzipGzipFile(gzipFilePath);
    console.log('解压完成,文件路径:', resultPath);
    return resultPath;
  } catch (err) {
    console.error('原生解压失败:', err);
    throw err;
  }
};

注意事项:

  • 确保React Native FS(react-native-fs)已正确安装并配置权限,iOS需在Info.plist中添加文件访问权限(如NSDocumentFolderUsageDescription)。
  • 若需兼容iOS 13以下版本,原生方案需引入Zlib库或第三方Gzip处理库(如GzipSwift)替代系统的Data.decompress()。

内容的提问来源于stack exchange,提问作者mutable2112

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:15:27