feat(note): improve audio MIME type detection during upload

- Replaced direct MIME type retrieval with a new method `detectAudioMimeType` to enhance stability in environments without fileinfo support.
- The new method prioritizes file extensions and falls back to the original file name if necessary, ensuring reliable MIME type detection for audio files.
This commit is contained in:
nepiedg
2026-04-20 02:06:36 +00:00
parent 3ad3b78d0f
commit 9cc82df980
+36 -1
View File
@@ -249,7 +249,11 @@ class NoteService
$audio->file_path = $savedPath; $audio->file_path = $savedPath;
$audio->file_url = $this->buildPublicFileUrl($savedPath); $audio->file_url = $this->buildPublicFileUrl($savedPath);
$audio->file_size = (int) $file->getSize(); $audio->file_size = (int) $file->getSize();
$audio->mime_type = (string) $file->getMime(); /**
* 线上环境若未启用 fileinfo/finfoThinkPHP 的 getMime() 会直接抛错。
* 这里改为按文件扩展名做稳定兜底,避免“文件已写入磁盘但接口因取 mime 失败而整体报错”。
*/
$audio->mime_type = $this->detectAudioMimeType($savedPath, $file);
$audio->duration_ms = max(0, $durationMs); $audio->duration_ms = max(0, $durationMs);
$audio->updated_at = $now; $audio->updated_at = $now;
$audio->save(); $audio->save();
@@ -409,6 +413,37 @@ class NoteService
]; ];
} }
/**
* 推断音频 MIME。
*
* 优先使用文件扩展名,避免依赖 fileinfo 扩展;若扩展名缺失,再尝试读取客户端原始文件名。
*
* @param string $savedPath
* @param File $file
* @return string
*/
private function detectAudioMimeType(string $savedPath, File $file): string
{
$extension = strtolower((string) pathinfo($savedPath, PATHINFO_EXTENSION));
if ($extension === '') {
$extension = strtolower((string) pathinfo((string) $file->getOriginalName(), PATHINFO_EXTENSION));
}
$mimeMap = [
'aac' => 'audio/aac',
'amr' => 'audio/amr',
'm4a' => 'audio/mp4',
'mp3' => 'audio/mpeg',
'mp4' => 'audio/mp4',
'ogg' => 'audio/ogg',
'pcm' => 'audio/L16',
'wav' => 'audio/wav',
'webm' => 'audio/webm',
];
return $mimeMap[$extension] ?? 'application/octet-stream';
}
/** /**
* 规范化标题 * 规范化标题
* *