oak-general-business/lib/utils/files/slice.js

81 lines
2.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sliceFile = sliceFile;
exports.sliceFileForMp = sliceFileForMp;
exports.cleanTempFiles = cleanTempFiles;
const tslib_1 = require("tslib");
const assert_1 = tslib_1.__importDefault(require("assert"));
const Exception_1 = require("../../types/Exception");
// 辅助方法:将文件切片
async function sliceFile(file, chunkSize, partCount) {
if (process.env.OAK_PLATFORM === 'wechatMp') {
// 微信小程序环境下file 可能是临时文件路径字符串
if (typeof file === 'string') {
return sliceFileForMp(file, chunkSize, partCount);
}
else {
(0, assert_1.default)(false, '小程序环境下得到不为string的文件');
}
}
(0, assert_1.default)(file instanceof File, '分片上传仅支持 File 类型的文件');
const chunks = [];
for (let i = 0; i < partCount; i++) {
const start = i * chunkSize;
const end = Math.min(start + chunkSize, file.size);
chunks.push(file.slice(start, end));
}
return chunks;
}
// 小程序环境下的文件分片
async function sliceFileForMp(filePath, chunkSize, partCount) {
const fs = wx.getFileSystemManager();
const tempDir = `${wx.env.USER_DATA_PATH}/oak_upload_temp`;
// 确保临时目录存在
try {
fs.accessSync(tempDir);
}
catch (e) {
fs.mkdirSync(tempDir, false);
}
const chunks = [];
// 读取文件信息
const fileStat = fs.statSync(filePath);
(0, assert_1.default)(!Array.isArray(fileStat), '无法获取文件信息');
const fileSize = fileStat.size;
// 读取每个分片并写入临时文件
for (let i = 0; i < partCount; i++) {
const start = i * chunkSize;
const length = Math.min(chunkSize, fileSize - start);
try {
chunks.push({
type: 'getter',
getFile: async () => {
// 读取分片数据
const data = fs.readFileSync(filePath, 'binary', start, length);
return data;
}
});
}
catch (err) {
console.error('分片读取失败:', err);
throw new Exception_1.OakUploadException(`分片 ${i + 1} 读取失败: ${err}`);
}
}
return chunks;
}
// 清理临时文件
async function cleanTempFiles(tempFiles) {
if (process.env.OAK_PLATFORM !== 'wechatMp') {
return;
}
const fs = wx.getFileSystemManager();
for (const filePath of tempFiles) {
try {
fs.unlinkSync(filePath);
}
catch (err) {
console.warn(`清理临时文件失败: ${filePath}`, err);
}
}
}