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

在React Native Expo项目中使用compressorjs遇到问题求助

问题根因

compressorjs 是面向浏览器环境开发的图片压缩库,内部依赖浏览器原生Canvas、FileReader等Web API实现压缩逻辑。React Native 运行环境没有实现上述浏览器专属API,所以即使你传入的Blob参数类型符合要求,也会触发运行异常,和你传入的参数类型无关。

适配Expo环境的实现方案

推荐使用Expo官方维护的expo-image-manipulator库实现图片压缩,无需额外原生配置,完全适配Expo运行环境,可完全替代compressorjs的能力。

第一步:安装依赖

运行命令安装库:
npx expo install expo-image-manipulator

第二步:改写代码逻辑

import * as ImageManipulator from 'expo-image-manipulator';

export const uploadPicture = async (uri, path) => {
    // 执行图片压缩,参数和你原有compressorjs配置对齐
    const compressedImage = await ImageManipulator.manipulateAsync(
        uri,
        [{ resize: { width: 512, height: 512 } }],
        {
            compress: 0.6,
            format: ImageManipulator.SaveFormat.JPEG
        }
    );

    // 将压缩后的图片URI转为Blob,用于后续Firebase上传
    const compressedBlob = await new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.onload = function () {
            resolve(xhr.response);
        };
        xhr.onerror = function (e) {
            console.log(e);
            reject(new TypeError("Network request failed"));
        };
        xhr.responseType = "blob";
        xhr.open("GET", compressedImage.uri, true);
        xhr.send(null);
    });

    // 此处直接使用compressedBlob执行你原有的Firebase上传逻辑即可
    // ...

    compressedBlob.close();
}

额外说明

如果是非Expo的纯React Native项目,可以选择react-native-image-compressor等原生封装的压缩库,不要使用浏览器端的compressorjs类库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:06:02