好的,下面是你提供的代码重构为使用 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();
}
注意事项:
- responseType:在
uni.request
中,我们使用了responseType: 'arraybuffer'
,因为 JSZip 可以接受 ArrayBuffer 对象作为输入。 - Blob 构造:在成功回调中,将响应数据转换为
Blob
对象,并返回给调用者。 - 网络请求错误处理:与之前类似,当请求失败或状态码不是200时,会抛出相应的错误。
这样,你就可以在 UniApp 环境下使用该代码进行 ZIP 文件打包。希望这个修改对你有帮助!如果有任何问题,请告诉我。
内容由零声教学AI助手提供,问题来源于学员提问