fix: 在对话中插入图片时,应该自动压缩一下 #132

This commit is contained in:
kangfenmao 2024-11-02 15:30:41 +08:00
parent cd835b7c36
commit e33d9ac0ae
5 changed files with 341 additions and 7 deletions

View File

@ -46,6 +46,7 @@
"fs-extra": "^11.2.0",
"html2canvas": "^1.4.1",
"officeparser": "^4.1.1",
"sharp": "^0.33.5",
"unzipper": "^0.12.3",
"webdav": "4.11.4"
},

View File

@ -1,4 +1,4 @@
export const imageExts = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp']
export const imageExts = ['.jpg', '.jpeg', '.png', '.gif', '.webp']
export const videoExts = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv']
export const audioExts = ['.mp3', '.wav', '.ogg', '.flac', '.aac']
export const documentExts = ['.pdf', '.docx', '.pptx', '.xlsx', '.odt', '.odp', '.ods']

View File

@ -1,4 +1,4 @@
import { documentExts } from '@main/constant'
import { documentExts, imageExts } from '@main/constant'
import { getFileType } from '@main/utils/file'
import { FileType } from '@types'
import * as crypto from 'crypto'
@ -17,6 +17,7 @@ import { readFile } from 'fs/promises'
import officeParser from 'officeparser'
import * as path from 'path'
import { chdir } from 'process'
import sharp from 'sharp'
import { v4 as uuidv4 } from 'uuid'
class FileManager {
@ -119,6 +120,33 @@ class FileManager {
return Promise.all(fileMetadataPromises)
}
private async compressImage(sourcePath: string, destPath: string): Promise<void> {
try {
const stats = fs.statSync(sourcePath)
const fileSizeInMB = stats.size / (1024 * 1024)
// 如果图片大于1MB才进行压缩
if (fileSizeInMB > 1) {
await sharp(sourcePath)
.resize(1920, 1080, {
fit: 'inside',
withoutEnlargement: true
})
.jpeg({ quality: 80 })
.toFile(destPath)
logger.info('[FileManager] Image compressed successfully:', sourcePath)
} else {
// 小图片直接复制
await fs.promises.copyFile(sourcePath, destPath)
}
} catch (error) {
logger.error('[FileManager] Image compression failed:', error)
// 压缩失败时直接复制原文件
await fs.promises.copyFile(sourcePath, destPath)
}
}
public uploadFile = async (_: Electron.IpcMainInvokeEvent, file: FileType): Promise<FileType> => {
const duplicateFile = await this.findDuplicateFile(file.path)
@ -128,10 +156,18 @@ class FileManager {
const uuid = uuidv4()
const origin_name = path.basename(file.path)
const ext = path.extname(origin_name)
const ext = path.extname(origin_name).toLowerCase()
const destPath = path.join(this.storageDir, uuid + ext)
logger.info('[FileManager] Uploading file:', file.path)
// 根据文件类型选择处理方式
if (imageExts.includes(ext)) {
await this.compressImage(file.path, destPath)
} else {
await fs.promises.copyFile(file.path, destPath)
}
const stats = await fs.promises.stat(destPath)
const fileType = getFileType(ext)

View File

@ -8,7 +8,7 @@ export const isMac = platform === 'darwin'
export const isWindows = platform === 'win32' || platform === 'win64'
export const isLinux = platform === 'linux'
export const imageExts = ['.jpg', '.png', '.jpeg']
export const imageExts = ['.jpg', '.jpeg', '.png', '.gif', '.webp']
export const documentExts = ['.pdf', '.docx', '.pptx', '.xlsx', '.odt', '.odp', '.ods']
export const textExts = [
'.txt', // 普通文本文件

301
yarn.lock
View File

@ -551,6 +551,15 @@ __metadata:
languageName: node
linkType: hard
"@emnapi/runtime@npm:^1.2.0":
version: 1.3.1
resolution: "@emnapi/runtime@npm:1.3.1"
dependencies:
tslib: "npm:^2.4.0"
checksum: 10c0/060ffede50f1b619c15083312b80a9e62a5b0c87aa8c1b54854c49766c9d69f8d1d3d87bd963a647071263a320db41b25eaa50b74d6a80dcc763c23dbeaafd6c
languageName: node
linkType: hard
"@emotion/hash@npm:^0.8.0":
version: 0.8.0
resolution: "@emotion/hash@npm:0.8.0"
@ -848,6 +857,181 @@ __metadata:
languageName: node
linkType: hard
"@img/sharp-darwin-arm64@npm:0.33.5":
version: 0.33.5
resolution: "@img/sharp-darwin-arm64@npm:0.33.5"
dependencies:
"@img/sharp-libvips-darwin-arm64": "npm:1.0.4"
dependenciesMeta:
"@img/sharp-libvips-darwin-arm64":
optional: true
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@img/sharp-darwin-x64@npm:0.33.5":
version: 0.33.5
resolution: "@img/sharp-darwin-x64@npm:0.33.5"
dependencies:
"@img/sharp-libvips-darwin-x64": "npm:1.0.4"
dependenciesMeta:
"@img/sharp-libvips-darwin-x64":
optional: true
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@img/sharp-libvips-darwin-arm64@npm:1.0.4":
version: 1.0.4
resolution: "@img/sharp-libvips-darwin-arm64@npm:1.0.4"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@img/sharp-libvips-darwin-x64@npm:1.0.4":
version: 1.0.4
resolution: "@img/sharp-libvips-darwin-x64@npm:1.0.4"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@img/sharp-libvips-linux-arm64@npm:1.0.4":
version: 1.0.4
resolution: "@img/sharp-libvips-linux-arm64@npm:1.0.4"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"@img/sharp-libvips-linux-arm@npm:1.0.5":
version: 1.0.5
resolution: "@img/sharp-libvips-linux-arm@npm:1.0.5"
conditions: os=linux & cpu=arm & libc=glibc
languageName: node
linkType: hard
"@img/sharp-libvips-linux-s390x@npm:1.0.4":
version: 1.0.4
resolution: "@img/sharp-libvips-linux-s390x@npm:1.0.4"
conditions: os=linux & cpu=s390x & libc=glibc
languageName: node
linkType: hard
"@img/sharp-libvips-linux-x64@npm:1.0.4":
version: 1.0.4
resolution: "@img/sharp-libvips-linux-x64@npm:1.0.4"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4":
version: 1.0.4
resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"@img/sharp-libvips-linuxmusl-x64@npm:1.0.4":
version: 1.0.4
resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.0.4"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@img/sharp-linux-arm64@npm:0.33.5":
version: 0.33.5
resolution: "@img/sharp-linux-arm64@npm:0.33.5"
dependencies:
"@img/sharp-libvips-linux-arm64": "npm:1.0.4"
dependenciesMeta:
"@img/sharp-libvips-linux-arm64":
optional: true
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"@img/sharp-linux-arm@npm:0.33.5":
version: 0.33.5
resolution: "@img/sharp-linux-arm@npm:0.33.5"
dependencies:
"@img/sharp-libvips-linux-arm": "npm:1.0.5"
dependenciesMeta:
"@img/sharp-libvips-linux-arm":
optional: true
conditions: os=linux & cpu=arm & libc=glibc
languageName: node
linkType: hard
"@img/sharp-linux-s390x@npm:0.33.5":
version: 0.33.5
resolution: "@img/sharp-linux-s390x@npm:0.33.5"
dependencies:
"@img/sharp-libvips-linux-s390x": "npm:1.0.4"
dependenciesMeta:
"@img/sharp-libvips-linux-s390x":
optional: true
conditions: os=linux & cpu=s390x & libc=glibc
languageName: node
linkType: hard
"@img/sharp-linux-x64@npm:0.33.5":
version: 0.33.5
resolution: "@img/sharp-linux-x64@npm:0.33.5"
dependencies:
"@img/sharp-libvips-linux-x64": "npm:1.0.4"
dependenciesMeta:
"@img/sharp-libvips-linux-x64":
optional: true
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"@img/sharp-linuxmusl-arm64@npm:0.33.5":
version: 0.33.5
resolution: "@img/sharp-linuxmusl-arm64@npm:0.33.5"
dependencies:
"@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4"
dependenciesMeta:
"@img/sharp-libvips-linuxmusl-arm64":
optional: true
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"@img/sharp-linuxmusl-x64@npm:0.33.5":
version: 0.33.5
resolution: "@img/sharp-linuxmusl-x64@npm:0.33.5"
dependencies:
"@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4"
dependenciesMeta:
"@img/sharp-libvips-linuxmusl-x64":
optional: true
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@img/sharp-wasm32@npm:0.33.5":
version: 0.33.5
resolution: "@img/sharp-wasm32@npm:0.33.5"
dependencies:
"@emnapi/runtime": "npm:^1.2.0"
conditions: cpu=wasm32
languageName: node
linkType: hard
"@img/sharp-win32-ia32@npm:0.33.5":
version: 0.33.5
resolution: "@img/sharp-win32-ia32@npm:0.33.5"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@img/sharp-win32-x64@npm:0.33.5":
version: 0.33.5
resolution: "@img/sharp-win32-x64@npm:0.33.5"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@isaacs/cliui@npm:^8.0.2":
version: 8.0.2
resolution: "@isaacs/cliui@npm:8.0.2"
@ -2326,6 +2510,7 @@ __metadata:
remark-gfm: "npm:^4.0.0"
remark-math: "npm:^6.0.0"
sass: "npm:^1.77.2"
sharp: "npm:^0.33.5"
styled-components: "npm:^6.1.11"
tinycolor2: "npm:^1.6.0"
typescript: "npm:^5.6.2"
@ -3577,13 +3762,23 @@ __metadata:
languageName: node
linkType: hard
"color-name@npm:~1.1.4":
"color-name@npm:^1.0.0, color-name@npm:~1.1.4":
version: 1.1.4
resolution: "color-name@npm:1.1.4"
checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95
languageName: node
linkType: hard
"color-string@npm:^1.9.0":
version: 1.9.1
resolution: "color-string@npm:1.9.1"
dependencies:
color-name: "npm:^1.0.0"
simple-swizzle: "npm:^0.2.2"
checksum: 10c0/b0bfd74c03b1f837f543898b512f5ea353f71630ccdd0d66f83028d1f0924a7d4272deb278b9aef376cacf1289b522ac3fb175e99895283645a2dc3a33af2404
languageName: node
linkType: hard
"color-support@npm:^1.1.3":
version: 1.1.3
resolution: "color-support@npm:1.1.3"
@ -3593,6 +3788,16 @@ __metadata:
languageName: node
linkType: hard
"color@npm:^4.2.3":
version: 4.2.3
resolution: "color@npm:4.2.3"
dependencies:
color-convert: "npm:^2.0.1"
color-string: "npm:^1.9.0"
checksum: 10c0/7fbe7cfb811054c808349de19fb380252e5e34e61d7d168ec3353e9e9aacb1802674bddc657682e4e9730c2786592a4de6f8283e7e0d3870b829bb0b7b2f6118
languageName: node
linkType: hard
"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6":
version: 1.0.8
resolution: "combined-stream@npm:1.0.8"
@ -4145,7 +4350,7 @@ __metadata:
languageName: node
linkType: hard
"detect-libc@npm:^2.0.0":
"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.3":
version: 2.0.3
resolution: "detect-libc@npm:2.0.3"
checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7
@ -6517,6 +6722,13 @@ __metadata:
languageName: node
linkType: hard
"is-arrayish@npm:^0.3.1":
version: 0.3.2
resolution: "is-arrayish@npm:0.3.2"
checksum: 10c0/f59b43dc1d129edb6f0e282595e56477f98c40278a2acdc8b0a5c57097c9eff8fe55470493df5775478cf32a4dc8eaf6d3a749f07ceee5bc263a78b2434f6a54
languageName: node
linkType: hard
"is-async-function@npm:^2.0.0":
version: 2.0.0
resolution: "is-async-function@npm:2.0.0"
@ -11006,6 +11218,75 @@ __metadata:
languageName: node
linkType: hard
"sharp@npm:^0.33.5":
version: 0.33.5
resolution: "sharp@npm:0.33.5"
dependencies:
"@img/sharp-darwin-arm64": "npm:0.33.5"
"@img/sharp-darwin-x64": "npm:0.33.5"
"@img/sharp-libvips-darwin-arm64": "npm:1.0.4"
"@img/sharp-libvips-darwin-x64": "npm:1.0.4"
"@img/sharp-libvips-linux-arm": "npm:1.0.5"
"@img/sharp-libvips-linux-arm64": "npm:1.0.4"
"@img/sharp-libvips-linux-s390x": "npm:1.0.4"
"@img/sharp-libvips-linux-x64": "npm:1.0.4"
"@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4"
"@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4"
"@img/sharp-linux-arm": "npm:0.33.5"
"@img/sharp-linux-arm64": "npm:0.33.5"
"@img/sharp-linux-s390x": "npm:0.33.5"
"@img/sharp-linux-x64": "npm:0.33.5"
"@img/sharp-linuxmusl-arm64": "npm:0.33.5"
"@img/sharp-linuxmusl-x64": "npm:0.33.5"
"@img/sharp-wasm32": "npm:0.33.5"
"@img/sharp-win32-ia32": "npm:0.33.5"
"@img/sharp-win32-x64": "npm:0.33.5"
color: "npm:^4.2.3"
detect-libc: "npm:^2.0.3"
semver: "npm:^7.6.3"
dependenciesMeta:
"@img/sharp-darwin-arm64":
optional: true
"@img/sharp-darwin-x64":
optional: true
"@img/sharp-libvips-darwin-arm64":
optional: true
"@img/sharp-libvips-darwin-x64":
optional: true
"@img/sharp-libvips-linux-arm":
optional: true
"@img/sharp-libvips-linux-arm64":
optional: true
"@img/sharp-libvips-linux-s390x":
optional: true
"@img/sharp-libvips-linux-x64":
optional: true
"@img/sharp-libvips-linuxmusl-arm64":
optional: true
"@img/sharp-libvips-linuxmusl-x64":
optional: true
"@img/sharp-linux-arm":
optional: true
"@img/sharp-linux-arm64":
optional: true
"@img/sharp-linux-s390x":
optional: true
"@img/sharp-linux-x64":
optional: true
"@img/sharp-linuxmusl-arm64":
optional: true
"@img/sharp-linuxmusl-x64":
optional: true
"@img/sharp-wasm32":
optional: true
"@img/sharp-win32-ia32":
optional: true
"@img/sharp-win32-x64":
optional: true
checksum: 10c0/6b81421ddfe6ee524d8d77e325c5e147fef22884e1c7b1656dfd89a88d7025894115da02d5f984261bf2e6daa16f98cadd1721c4ba408b4212b1d2a60f233484
languageName: node
linkType: hard
"shebang-command@npm:^2.0.0":
version: 2.0.0
resolution: "shebang-command@npm:2.0.0"
@ -11066,6 +11347,15 @@ __metadata:
languageName: node
linkType: hard
"simple-swizzle@npm:^0.2.2":
version: 0.2.2
resolution: "simple-swizzle@npm:0.2.2"
dependencies:
is-arrayish: "npm:^0.3.1"
checksum: 10c0/df5e4662a8c750bdba69af4e8263c5d96fe4cd0f9fe4bdfa3cbdeb45d2e869dff640beaaeb1ef0e99db4d8d2ec92f85508c269f50c972174851bc1ae5bd64308
languageName: node
linkType: hard
"simple-update-notifier@npm:2.0.0":
version: 2.0.0
resolution: "simple-update-notifier@npm:2.0.0"
@ -11911,6 +12201,13 @@ __metadata:
languageName: node
linkType: hard
"tslib@npm:^2.4.0":
version: 2.8.1
resolution: "tslib@npm:2.8.1"
checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62
languageName: node
linkType: hard
"tunnel-agent@npm:^0.6.0":
version: 0.6.0
resolution: "tunnel-agent@npm:0.6.0"