fix(admin-service): 修复 APK 解析失败 — 写入临时文件后再解析
adbkit-apkreader v3 底层使用 yauzl.open(),只接受文件路径, 传入 Buffer 会被当成文件路径字符串导致 ENOENT。 改为先将 Buffer 写入 os.tmpdir() 临时文件,解析完成后在 finally 中删除。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
4369aecf60
commit
e00cbb71c5
|
|
@ -1,3 +1,6 @@
|
|||
import * as fs from 'fs';
|
||||
import * as os from 'os';
|
||||
import * as path from 'path';
|
||||
import { Injectable, Logger, BadRequestException } from '@nestjs/common';
|
||||
import { IPackageParser, ParsedPackageInfo } from '../../domain/ports/package-parser.interface';
|
||||
|
||||
|
|
@ -13,10 +16,13 @@ export class PackageParserService implements IPackageParser {
|
|||
}
|
||||
|
||||
private async parseApk(buffer: Buffer): Promise<ParsedPackageInfo> {
|
||||
// adbkit-apkreader v3 底层用 yauzl.open(),只接受文件路径而非 Buffer
|
||||
// 先写入临时文件,解析后删除
|
||||
const tmpFile = path.join(os.tmpdir(), `apk-parse-${Date.now()}.apk`);
|
||||
try {
|
||||
// Dynamic import to handle missing dependency gracefully
|
||||
fs.writeFileSync(tmpFile, buffer);
|
||||
const ApkReader = await import('adbkit-apkreader').then(m => m.default || m);
|
||||
const reader = await ApkReader.open(buffer);
|
||||
const reader = await ApkReader.open(tmpFile);
|
||||
const manifest = await reader.readManifest();
|
||||
return {
|
||||
packageName: manifest.package || 'unknown',
|
||||
|
|
@ -33,6 +39,8 @@ export class PackageParserService implements IPackageParser {
|
|||
versionName: '0.0.0',
|
||||
platform: 'ANDROID',
|
||||
};
|
||||
} finally {
|
||||
try { fs.unlinkSync(tmpFile); } catch { /* ignore */ }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue