fix: Enhance file handling and inspection method mapping

- Updated fileController to include Cross-Origin-Resource-Policy headers for improved security and file handling.
- Added error handling for file streams to ensure robust responses in case of read errors.
- Modified materialStatusController to correctly map material IDs to their respective codes for inventory stock queries.
- Enhanced moldController to include warranty shot count in mold creation and update processes.
- Improved item inspection page by adding inspection method category loading and mapping, ensuring accurate display of method labels in the UI.

These changes aim to enhance the overall functionality and user experience across multiple companies by ensuring proper file handling, data mapping, and error management.
This commit is contained in:
kjs
2026-04-10 15:59:38 +09:00
parent b8860e56e5
commit 2f50d7d809
24 changed files with 414 additions and 123 deletions

View File

@@ -924,12 +924,26 @@ export const previewFile = async (
);
res.setHeader("Access-Control-Allow-Credentials", "true");
// 캐시 헤더 설정
// Cross-Origin-Resource-Policy: cross-origin 설정
// helmet 기본값(same-origin)을 오버라이드하여 v1.vexplor.com에서 api.vexplor.com 이미지 로드 허용
res.setHeader("Cross-Origin-Resource-Policy", "cross-origin");
// 파일 크기 및 캐시 헤더 설정
const stat = fs.statSync(finalPath);
res.setHeader("Content-Length", stat.size);
res.setHeader("Cache-Control", "public, max-age=3600");
res.setHeader("Content-Type", mimeType);
// 파일 스트림으로 전송
const fileStream = fs.createReadStream(finalPath);
fileStream.on("error", (err) => {
console.error("파일 스트림 오류:", err);
if (!res.headersSent) {
res.status(500).json({ success: false, message: "파일 읽기 오류" });
} else {
res.end();
}
});
fileStream.pipe(res);
} catch (error) {
console.error("파일 미리보기 오류:", error);
@@ -1031,9 +1045,20 @@ export const downloadFile = async (
`attachment; filename="${encodeURIComponent(fileRecord.real_file_name!)}"`
);
res.setHeader("Content-Type", "application/octet-stream");
res.setHeader("Cross-Origin-Resource-Policy", "cross-origin");
const stat = fs.statSync(filePath);
res.setHeader("Content-Length", stat.size);
// 파일 스트림 전송
const fileStream = fs.createReadStream(filePath);
fileStream.on("error", (err) => {
console.error("파일 스트림 오류:", err);
if (!res.headersSent) {
res.status(500).json({ success: false, message: "파일 읽기 오류" });
} else {
res.end();
}
});
fileStream.pipe(res);
} catch (error) {
console.error("파일 다운로드 오류:", error);
@@ -1218,10 +1243,21 @@ export const getFileByToken = async (req: Request, res: Response) => {
"Content-Disposition",
`inline; filename="${encodeURIComponent(fileRecord.real_file_name!)}"`
);
res.setHeader("Cross-Origin-Resource-Policy", "cross-origin");
const stat = fs.statSync(filePath);
res.setHeader("Content-Length", stat.size);
res.setHeader("Cache-Control", "public, max-age=300"); // 5분 캐시
// 파일 스트림 전송
const fileStream = fs.createReadStream(filePath);
fileStream.on("error", (err) => {
console.error("파일 스트림 오류:", err);
if (!res.headersSent) {
res.status(500).json({ success: false, message: "파일 읽기 오류" });
} else {
res.end();
}
});
fileStream.pipe(res);
} catch (error) {
console.error("❌ 토큰 파일 접근 오류:", error);