ZBLOG

Vue.prototype.zipMedia = async function(media) { const zip = new JSZip(); console.log("media.length: ", media.length); console.log("zipMedia_media: ", media); if (!media || media.length === 0) { return null; // 返回 null 表示没...

好的,下面是你提供的代码重构为使用 uni.request 的版本。我们将 loadLocalFile 函数替换为利用 uni.request 来获取文件内容。

Vue.prototype.zipMedia = async function(media) {
    const zip = new JSZip();
    console.log("media.length: ", media.length);
    console.log("zipMedia_media: ", media);

    if (!media || media.length === 0) {
        return null; // 返回 null 表示没有媒体文件
    }

    // 创建一个数组来存储所有媒体文件的 Promise
    const mediaPromises = media.map(async (filePath, i) => {
        console.log("Processing file:", filePath);

        // 验证文件路径
        if (!isValidFilePath(filePath)) {
            console.error('Invalid file path:', filePath);
            throw new Error('Invalid file path');
        }

        // 获取文件扩展名
        const ext = getFileExtension(filePath).toLowerCase();
        console.log("File extension:", ext);

        try {
            // 使用 uni.request 加载文件内容
            const blob = await loadLocalFile(filePath); 

            // 将文件添加到 zip 中
            zip.file(`file${i + 1}.${ext}`, blob);
            console.log("File added to zip:", `file${i + 1}.${ext}`);
        } catch (error) {
            console.error('Error processing file:', filePath, error);
            throw error;
        }
    });

    // 等待所有文件处理完成
    try {
        await Promise.all(mediaPromises);
    } catch (error) {
        console.error('Failed to process some files:', error);
        throw error;
    }

    // 生成 zip 文件
    try {
        const content = await zip.generateAsync({ type: 'blob' });
        return content;
    } catch (error) {
        console.error('Failed to generate zip file:', error);
        throw error;
    }
};

// 自定义加载本地 URL 文件的函数示例,使用 uni.request 替代 XMLHttpRequest
async function loadLocalFile(filePath) {
    return new Promise((resolve, reject) => {
        uni.request({
            url: filePath,
            method: 'GET',
            responseType: 'arraybuffer', // 设置响应类型为 arraybuffer,以便后续转 Blob
            
            success: (res) => {
                if (res.statusCode === 200 && res.data) {
                    resolve(new Blob([res.data])); // 将 arraybuffer 转为 Blob 对象并返回
                } else {
                    reject(new Error('Failed to load local file'));
                }
            },
            
            fail: () => {
                reject(new Error('Network error while loading local file'));
            }
        });
    });
}

// 辅助函数:验证文件路径
function isValidFilePath(filePath) {
    return typeof filePath === 'string' && filePath.startsWith('http://tmp/');
}

// 辅助函数:获取文件扩展名
function getFileExtension(filePath) {
    return filePath.split('.').pop();
}

注意事项:

  1. responseType:在 uni.request 中,我们使用了 responseType: 'arraybuffer',因为 JSZip 可以接受 ArrayBuffer 对象作为输入。
  2. Blob 构造:在成功回调中,将响应数据转换为 Blob 对象,并返回给调用者。
  3. 网络请求错误处理:与之前类似,当请求失败或状态码不是200时,会抛出相应的错误。

这样,你就可以在 UniApp 环境下使用该代码进行 ZIP 文件打包。希望这个修改对你有帮助!如果有任何问题,请告诉我。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20998

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?