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 { Injectable, Logger, BadRequestException } from '@nestjs/common';
|
||||||
import { IPackageParser, ParsedPackageInfo } from '../../domain/ports/package-parser.interface';
|
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> {
|
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 {
|
try {
|
||||||
// Dynamic import to handle missing dependency gracefully
|
fs.writeFileSync(tmpFile, buffer);
|
||||||
const ApkReader = await import('adbkit-apkreader').then(m => m.default || m);
|
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();
|
const manifest = await reader.readManifest();
|
||||||
return {
|
return {
|
||||||
packageName: manifest.package || 'unknown',
|
packageName: manifest.package || 'unknown',
|
||||||
|
|
@ -33,6 +39,8 @@ export class PackageParserService implements IPackageParser {
|
||||||
versionName: '0.0.0',
|
versionName: '0.0.0',
|
||||||
platform: 'ANDROID',
|
platform: 'ANDROID',
|
||||||
};
|
};
|
||||||
|
} finally {
|
||||||
|
try { fs.unlinkSync(tmpFile); } catch { /* ignore */ }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue