mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-04 03:40:33 +08:00
feat: add upload file (#8035)
This commit is contained in:
parent
c05c06b7a1
commit
bcc1046cdf
@ -147,6 +147,7 @@ export enum IpcChannel {
|
|||||||
File_Base64File = 'file:base64File',
|
File_Base64File = 'file:base64File',
|
||||||
File_GetPdfInfo = 'file:getPdfInfo',
|
File_GetPdfInfo = 'file:getPdfInfo',
|
||||||
Fs_Read = 'fs:read',
|
Fs_Read = 'fs:read',
|
||||||
|
File_OpenWithRelativePath = 'file:openWithRelativePath',
|
||||||
|
|
||||||
// file service
|
// file service
|
||||||
FileService_Upload = 'file-service:upload',
|
FileService_Upload = 'file-service:upload',
|
||||||
|
|||||||
@ -399,6 +399,7 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) {
|
|||||||
ipcMain.handle(IpcChannel.File_Download, fileManager.downloadFile)
|
ipcMain.handle(IpcChannel.File_Download, fileManager.downloadFile)
|
||||||
ipcMain.handle(IpcChannel.File_Copy, fileManager.copyFile)
|
ipcMain.handle(IpcChannel.File_Copy, fileManager.copyFile)
|
||||||
ipcMain.handle(IpcChannel.File_BinaryImage, fileManager.binaryImage)
|
ipcMain.handle(IpcChannel.File_BinaryImage, fileManager.binaryImage)
|
||||||
|
ipcMain.handle(IpcChannel.File_OpenWithRelativePath, fileManager.openFileWithRelativePath)
|
||||||
|
|
||||||
// file service
|
// file service
|
||||||
ipcMain.handle(IpcChannel.FileService_Upload, async (_, provider: Provider, file: FileMetadata) => {
|
ipcMain.handle(IpcChannel.FileService_Upload, async (_, provider: Provider, file: FileMetadata) => {
|
||||||
|
|||||||
@ -417,6 +417,19 @@ class FileStorage {
|
|||||||
shell.openPath(path).catch((err) => logger.error('[IPC - Error] Failed to open file:', err))
|
shell.openPath(path).catch((err) => logger.error('[IPC - Error] Failed to open file:', err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过相对路径打开文件,跨设备时使用
|
||||||
|
* @param file
|
||||||
|
*/
|
||||||
|
public openFileWithRelativePath = async (_: Electron.IpcMainInvokeEvent, file: FileMetadata): Promise<void> => {
|
||||||
|
const filePath = path.join(this.storageDir, file.name)
|
||||||
|
if (fs.existsSync(filePath)) {
|
||||||
|
shell.openPath(filePath).catch((err) => logger.error('[IPC - Error] Failed to open file:', err))
|
||||||
|
} else {
|
||||||
|
logger.warn('[IPC - Warning] File does not exist:', filePath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public save = async (
|
public save = async (
|
||||||
_: Electron.IpcMainInvokeEvent,
|
_: Electron.IpcMainInvokeEvent,
|
||||||
fileName: string,
|
fileName: string,
|
||||||
|
|||||||
@ -146,7 +146,8 @@ const api = {
|
|||||||
copy: (fileId: string, destPath: string) => ipcRenderer.invoke(IpcChannel.File_Copy, fileId, destPath),
|
copy: (fileId: string, destPath: string) => ipcRenderer.invoke(IpcChannel.File_Copy, fileId, destPath),
|
||||||
base64File: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_Base64File, fileId),
|
base64File: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_Base64File, fileId),
|
||||||
pdfInfo: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_GetPdfInfo, fileId),
|
pdfInfo: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_GetPdfInfo, fileId),
|
||||||
getPathForFile: (file: File) => webUtils.getPathForFile(file)
|
getPathForFile: (file: File) => webUtils.getPathForFile(file),
|
||||||
|
openFileWithRelativePath: (file: FileMetadata) => ipcRenderer.invoke(IpcChannel.File_OpenWithRelativePath, file)
|
||||||
},
|
},
|
||||||
fs: {
|
fs: {
|
||||||
read: (pathOrUrl: string, encoding?: BufferEncoding) => ipcRenderer.invoke(IpcChannel.Fs_Read, pathOrUrl, encoding)
|
read: (pathOrUrl: string, encoding?: BufferEncoding) => ipcRenderer.invoke(IpcChannel.Fs_Read, pathOrUrl, encoding)
|
||||||
|
|||||||
@ -145,7 +145,8 @@ export const useKnowledge = (baseId: string) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (item.type === 'file' && typeof item.content === 'object') {
|
if (item.type === 'file' && typeof item.content === 'object') {
|
||||||
await window.api.file.deleteDir(item.content.id)
|
// name: eg. text.pdf
|
||||||
|
await window.api.file.delete(item.content.name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 刷新项目
|
// 刷新项目
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import Ellipsis from '@renderer/components/Ellipsis'
|
|||||||
import { useKnowledge } from '@renderer/hooks/useKnowledge'
|
import { useKnowledge } from '@renderer/hooks/useKnowledge'
|
||||||
import FileItem from '@renderer/pages/files/FileItem'
|
import FileItem from '@renderer/pages/files/FileItem'
|
||||||
import StatusIcon from '@renderer/pages/knowledge/components/StatusIcon'
|
import StatusIcon from '@renderer/pages/knowledge/components/StatusIcon'
|
||||||
|
import FileManager from '@renderer/services/FileManager'
|
||||||
import { getProviderName } from '@renderer/services/ProviderService'
|
import { getProviderName } from '@renderer/services/ProviderService'
|
||||||
import { FileMetadata, FileType, FileTypes, KnowledgeBase, KnowledgeItem } from '@renderer/types'
|
import { FileMetadata, FileType, FileTypes, KnowledgeBase, KnowledgeItem } from '@renderer/types'
|
||||||
import { formatFileSize, uuid } from '@renderer/utils'
|
import { formatFileSize, uuid } from '@renderer/utils'
|
||||||
@ -111,8 +112,9 @@ const KnowledgeFiles: FC<KnowledgeContentProps> = ({ selectedBase, progressMap,
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.filter(({ ext }) => fileTypes.includes(ext))
|
.filter(({ ext }) => fileTypes.includes(ext))
|
||||||
// const uploadedFiles = await FileManager.uploadFiles(_files)
|
const uploadedFiles = await FileManager.uploadFiles(_files)
|
||||||
addFiles(_files)
|
console.log('uploadedFiles', uploadedFiles)
|
||||||
|
addFiles(uploadedFiles)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,7 +174,7 @@ const KnowledgeFiles: FC<KnowledgeContentProps> = ({ selectedBase, progressMap,
|
|||||||
key={item.id}
|
key={item.id}
|
||||||
fileInfo={{
|
fileInfo={{
|
||||||
name: (
|
name: (
|
||||||
<ClickableSpan onClick={() => window.api.file.openPath(file.path)}>
|
<ClickableSpan onClick={() => window.api.file.openFileWithRelativePath(file)}>
|
||||||
<Ellipsis>
|
<Ellipsis>
|
||||||
<Tooltip title={file.origin_name}>{file.origin_name}</Tooltip>
|
<Tooltip title={file.origin_name}>{file.origin_name}</Tooltip>
|
||||||
</Ellipsis>
|
</Ellipsis>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user