|
|
@ -10,6 +10,7 @@ import { fileURLToPath } from "url" |
|
|
import CommonError from "@/utils/error/CommonError" |
|
|
import CommonError from "@/utils/error/CommonError" |
|
|
import { logger } from "@/logger.js" |
|
|
import { logger } from "@/logger.js" |
|
|
import { R } from "@/utils/helper" |
|
|
import { R } from "@/utils/helper" |
|
|
|
|
|
import imageThumbnail from "image-thumbnail" |
|
|
|
|
|
|
|
|
class PageController { |
|
|
class PageController { |
|
|
constructor() { |
|
|
constructor() { |
|
|
@ -257,13 +258,16 @@ class PageController { |
|
|
{ mime: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ext: ".xlsx" }, // .xlsx
|
|
|
{ mime: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ext: ".xlsx" }, // .xlsx
|
|
|
{ mime: "application/vnd.ms-excel", ext: ".xls" }, // .xls
|
|
|
{ mime: "application/vnd.ms-excel", ext: ".xls" }, // .xls
|
|
|
{ mime: "application/msword", ext: ".doc" }, // .doc
|
|
|
{ mime: "application/msword", ext: ".doc" }, // .doc
|
|
|
{ mime: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", ext: ".docx" } // .docx
|
|
|
{ mime: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", ext: ".docx" }, // .docx
|
|
|
] |
|
|
] |
|
|
let typeList = defaultTypeList |
|
|
let typeList = defaultTypeList |
|
|
|
|
|
|
|
|
// 支持通过ctx.query.allowedTypes自定义类型(逗号分隔,自动过滤无效类型)
|
|
|
// 支持通过ctx.query.allowedTypes自定义类型(逗号分隔,自动过滤无效类型)
|
|
|
if (ctx.query.allowedTypes) { |
|
|
if (ctx.query.allowedTypes) { |
|
|
const allowed = ctx.query.allowedTypes.split(",").map(t => t.trim()).filter(Boolean) |
|
|
const allowed = ctx.query.allowedTypes |
|
|
|
|
|
.split(",") |
|
|
|
|
|
.map(t => t.trim()) |
|
|
|
|
|
.filter(Boolean) |
|
|
typeList = defaultTypeList.filter(item => allowed.includes(item.mime)) |
|
|
typeList = defaultTypeList.filter(item => allowed.includes(item.mime)) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -368,18 +372,27 @@ class PageController { |
|
|
|
|
|
|
|
|
// formidable v2 的文件对象
|
|
|
// formidable v2 的文件对象
|
|
|
const oldPath = picked.filepath || picked.path |
|
|
const oldPath = picked.filepath || picked.path |
|
|
|
|
|
const result = { url: "", thumb: "" } |
|
|
const ext = path.extname(picked.originalFilename || picked.newFilename || "") || path.extname(oldPath || "") || ".jpg" |
|
|
const ext = path.extname(picked.originalFilename || picked.newFilename || "") || path.extname(oldPath || "") || ".jpg" |
|
|
const safeExt = [".jpg", ".jpeg", ".png", ".webp", ".gif"].includes(ext.toLowerCase()) ? ext : ".jpg" |
|
|
const safeExt = [".jpg", ".jpeg", ".png", ".webp", ".gif"].includes(ext.toLowerCase()) ? ext : ".jpg" |
|
|
const filename = `${ctx.session.user.id}-${Date.now()}${safeExt}` |
|
|
const filename = `${ctx.session.user.id}-${Date.now()}/raw${safeExt}` |
|
|
const destPath = path.join(avatarsDir, filename) |
|
|
const destPath = path.join(avatarsDir, filename) |
|
|
|
|
|
|
|
|
// 如果设置了 uploadDir 且 keepExtensions,文件可能已在该目录,仍统一重命名
|
|
|
// 如果设置了 uploadDir 且 keepExtensions,文件可能已在该目录,仍统一重命名
|
|
|
if (oldPath && oldPath !== destPath) { |
|
|
if (oldPath && oldPath !== destPath) { |
|
|
|
|
|
await fs.mkdir(path.parse(destPath).dir, { recursive: true }) |
|
|
await fs.rename(oldPath, destPath) |
|
|
await fs.rename(oldPath, destPath) |
|
|
|
|
|
try { |
|
|
|
|
|
const thumbnail = await imageThumbnail(destPath) |
|
|
|
|
|
fs.writeFile(destPath.replace(/raw\./, "thumb."), thumbnail) |
|
|
|
|
|
} catch (err) { |
|
|
|
|
|
console.error(err) |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
const url = `/uploads/avatars/${filename}` |
|
|
const url = `/uploads/avatars/${filename}` |
|
|
|
|
|
result.url = url |
|
|
|
|
|
result.thumb = url.replace(/raw\./, "thumb.") |
|
|
const updatedUser = await this.userService.updateUser(ctx.session.user.id, { avatar: url }) |
|
|
const updatedUser = await this.userService.updateUser(ctx.session.user.id, { avatar: url }) |
|
|
ctx.session.user = { ...ctx.session.user, ...updatedUser } |
|
|
ctx.session.user = { ...ctx.session.user, ...updatedUser } |
|
|
|
|
|
|
|
|
@ -387,6 +400,7 @@ class PageController { |
|
|
success: true, |
|
|
success: true, |
|
|
message: "头像上传成功", |
|
|
message: "头像上传成功", |
|
|
url, |
|
|
url, |
|
|
|
|
|
thumb: result.thumb, |
|
|
user: updatedUser, |
|
|
user: updatedUser, |
|
|
} |
|
|
} |
|
|
} catch (error) { |
|
|
} catch (error) { |
|
|
|