feat(media): 添加图片资源解密与SSE进度

- 后端新增图片解密密钥获取/保存接口(/api/media/keys)

- 新增批量解密接口与输出结构:resource/{md5前2位}/{md5}.{ext}

- 新增资源直读接口(/api/media/resource/{md5}),自动识别媒体类型返回

- 新增SSE实时进度接口(/api/media/decrypt_all_stream),前端可实时展示进度

- 前端解密页增加图片解密步骤与进度条/统计/失败说明,并对接相关API

- README 补充图片资源解密使用说明
This commit is contained in:
2977094657
2025-12-17 16:56:54 +08:00
parent 58f3c6862d
commit 8341c3159e
5 changed files with 1283 additions and 39 deletions

View File

@@ -94,6 +94,37 @@ export const useApi = () => {
const url = '/chat/media/open_folder' + (query.toString() ? `?${query.toString()}` : '')
return await request(url, { method: 'POST' })
}
// 获取图片解密密钥
const getMediaKeys = async (params = {}) => {
const query = new URLSearchParams()
if (params && params.account) query.set('account', params.account)
if (params && params.force_extract) query.set('force_extract', 'true')
const url = '/media/keys' + (query.toString() ? `?${query.toString()}` : '')
return await request(url)
}
// 保存图片解密密钥
const saveMediaKeys = async (params = {}) => {
const query = new URLSearchParams()
if (params && params.account) query.set('account', params.account)
if (params && params.xor_key) query.set('xor_key', params.xor_key)
if (params && params.aes_key) query.set('aes_key', params.aes_key)
const url = '/media/keys' + (query.toString() ? `?${query.toString()}` : '')
return await request(url, { method: 'POST', body: { account: params.account, force_extract: false } })
}
// 批量解密所有图片
const decryptAllMedia = async (params = {}) => {
return await request('/media/decrypt_all', {
method: 'POST',
body: {
account: params.account || null,
xor_key: params.xor_key || null,
aes_key: params.aes_key || null
}
})
}
return {
detectWechat,
@@ -103,6 +134,9 @@ export const useApi = () => {
listChatAccounts,
listChatSessions,
listChatMessages,
openChatMediaFolder
openChatMediaFolder,
getMediaKeys,
saveMediaKeys,
decryptAllMedia
}
}