81 lines
2.7 KiB
JavaScript
81 lines
2.7 KiB
JavaScript
"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);
|
||
}
|
||
}
|
||
}
|