Feature: add delete local file after uploading, fix compatibility with auto-delete

ISSUES CLOSED: #40
This commit is contained in:
萌萌哒赫萝 2023-04-18 19:33:49 +08:00
parent 34997f58aa
commit 6b49198d19
12 changed files with 54 additions and 8 deletions

View File

@ -68,7 +68,7 @@
"mime-types": "^2.1.35", "mime-types": "^2.1.35",
"mitt": "^3.0.0", "mitt": "^3.0.0",
"nodejs-file-downloader": "^4.10.6", "nodejs-file-downloader": "^4.10.6",
"piclist": "^0.5.1", "piclist": "^0.5.2",
"pinia": "^2.0.32", "pinia": "^2.0.32",
"pinia-plugin-persistedstate": "^3.1.0", "pinia-plugin-persistedstate": "^3.1.0",
"qiniu": "^7.8.0", "qiniu": "^7.8.0",

View File

@ -197,6 +197,7 @@ SETTINGS_ISHIDEDOCK_TIPS: Not support hide dock and tray at the same time
SETTINGS_ENCODE_OUTPUT_URL: Encode Output(or Copyed) URL SETTINGS_ENCODE_OUTPUT_URL: Encode Output(or Copyed) URL
SETTINGS_WATCH_CLIPBOARD: Watch clipboard when software start SETTINGS_WATCH_CLIPBOARD: Watch clipboard when software start
SETTINGS_SHORT_URL: Use short url SETTINGS_SHORT_URL: Use short url
SETTINGS_DELETE_LOCAL_FILE_AFTER_UPLOAD: Delete local file after upload
# shortcut-page # shortcut-page
BUILTIN_CLIPBOARD_TIPS: Use builtin clipboard function to upload instead of using scripts BUILTIN_CLIPBOARD_TIPS: Use builtin clipboard function to upload instead of using scripts

View File

@ -199,6 +199,7 @@ SETTINGS_ISHIDEDOCK_TIPS: 不支持同时隐藏dock和托盘
SETTINGS_ENCODE_OUTPUT_URL: 输出(复制) URL 时进行转义 SETTINGS_ENCODE_OUTPUT_URL: 输出(复制) URL 时进行转义
SETTINGS_WATCH_CLIPBOARD: 软件启动时自动监听剪贴板上传 SETTINGS_WATCH_CLIPBOARD: 软件启动时自动监听剪贴板上传
SETTINGS_SHORT_URL: 使用短链接 SETTINGS_SHORT_URL: 使用短链接
SETTINGS_DELETE_LOCAL_FILE_AFTER_UPLOAD: 上传后删除本地文件
# shortcut-page # shortcut-page
SHORTCUT_NAME: 快捷键名称 SHORTCUT_NAME: 快捷键名称

View File

@ -197,6 +197,7 @@ SETTINGS_ISHIDEDOCK_TIPS: 不支持同時隱藏dock和托盘
SETTINGS_ENCODE_OUTPUT_URL: 輸出(複製) URL 時進行轉義 SETTINGS_ENCODE_OUTPUT_URL: 輸出(複製) URL 時進行轉義
SETTINGS_WATCH_CLIPBOARD: 軟體啟動時自動監聽剪貼簿上傳 SETTINGS_WATCH_CLIPBOARD: 軟體啟動時自動監聽剪貼簿上傳
SETTINGS_SHORT_URL: 使用短網址 SETTINGS_SHORT_URL: 使用短網址
SETTINGS_DELETE_LOCAL_FILE_AFTER_UPLOAD: 上傳後刪除本地檔案
# shortcut-page # shortcut-page
SHORTCUT_NAME: 快捷鍵名稱 SHORTCUT_NAME: 快捷鍵名稱

View File

@ -23,6 +23,7 @@ import clipboardListener from 'clipboard-event'
import clipboardPoll from '~/main/utils/clipboardPoll' import clipboardPoll from '~/main/utils/clipboardPoll'
import picgo from '../../core/picgo' import picgo from '../../core/picgo'
import { uploadClipboardFiles } from '../uploader/apis' import { uploadClipboardFiles } from '../uploader/apis'
import { cloneDeep } from 'lodash'
let contextMenu: Menu | null let contextMenu: Menu | null
let tray: Tray | null let tray: Tray | null
@ -394,13 +395,18 @@ export function createTray () {
// so the tray window must be available // so the tray window must be available
tray.on('drop-files', async (event: Event, files: string[]) => { tray.on('drop-files', async (event: Event, files: string[]) => {
const pasteStyle = db.get('settings.pasteStyle') || 'markdown' const pasteStyle = db.get('settings.pasteStyle') || 'markdown'
const rawInput = cloneDeep(files)
const trayWindow = windowManager.get(IWindowList.TRAY_WINDOW)! const trayWindow = windowManager.get(IWindowList.TRAY_WINDOW)!
const imgs = await uploader const imgs = await uploader
.setWebContents(trayWindow.webContents) .setWebContents(trayWindow.webContents)
.upload(files) .upload(files)
const deleteLocalFile = db.get('settings.deleteLocalFile') || false
if (imgs !== false) { if (imgs !== false) {
const pasteText: string[] = [] const pasteText: string[] = []
for (let i = 0; i < imgs.length; i++) { for (let i = 0; i < imgs.length; i++) {
if (deleteLocalFile) {
await fs.remove(rawInput[i])
}
pasteText.push(await (pasteTemplate(pasteStyle, imgs[i], db.get('settings.customLink')))) pasteText.push(await (pasteTemplate(pasteStyle, imgs[i], db.get('settings.customLink'))))
const notification = new Notification({ const notification = new Notification({
title: T('UPLOAD_SUCCEED'), title: T('UPLOAD_SUCCEED'),

View File

@ -13,6 +13,8 @@ import { T } from '~/main/i18n/index'
import ALLApi from '@/apis/allApi' import ALLApi from '@/apis/allApi'
import picgo from '@core/picgo' import picgo from '@core/picgo'
import GuiApi from '../../gui' import GuiApi from '../../gui'
import fs from 'fs-extra'
import { cloneDeep } from 'lodash'
const handleClipboardUploading = async (): Promise<false | ImgInfo[]> => { const handleClipboardUploading = async (): Promise<false | ImgInfo[]> => {
const useBuiltinClipboard = db.get('settings.useBuiltinClipboard') === undefined ? true : !!db.get('settings.useBuiltinClipboard') const useBuiltinClipboard = db.get('settings.useBuiltinClipboard') === undefined ? true : !!db.get('settings.useBuiltinClipboard')
@ -71,12 +73,21 @@ export const uploadClipboardFiles = async (): Promise<IStringKeyMap> => {
export const uploadChoosedFiles = async (webContents: WebContents, files: IFileWithPath[]): Promise<IStringKeyMap[]> => { export const uploadChoosedFiles = async (webContents: WebContents, files: IFileWithPath[]): Promise<IStringKeyMap[]> => {
const input = files.map(item => item.path) const input = files.map(item => item.path)
const rawInput = cloneDeep(input)
const imgs = await uploader.setWebContents(webContents).upload(input) const imgs = await uploader.setWebContents(webContents).upload(input)
const result = [] const result = []
if (imgs !== false) { if (imgs !== false) {
const pasteStyle = db.get('settings.pasteStyle') || 'markdown' const pasteStyle = db.get('settings.pasteStyle') || 'markdown'
const deleteLocalFile = db.get('settings.deleteLocalFile') || false
const pasteText: string[] = [] const pasteText: string[] = []
for (let i = 0; i < imgs.length; i++) { for (let i = 0; i < imgs.length; i++) {
if (deleteLocalFile) {
fs.remove(rawInput[i]).then(() => {
picgo.log.info(`delete local file: ${rawInput[i]}`)
}).catch((err: Error) => {
picgo.log.error(err)
})
}
pasteText.push(await (pasteTemplate(pasteStyle, imgs[i], db.get('settings.customLink')))) pasteText.push(await (pasteTemplate(pasteStyle, imgs[i], db.get('settings.customLink'))))
const notification = new Notification({ const notification = new Notification({
title: T('UPLOAD_SUCCEED'), title: T('UPLOAD_SUCCEED'),

View File

@ -18,6 +18,8 @@ import {
} from '~/universal/events/constants' } from '~/universal/events/constants'
import { DBStore } from '@picgo/store' import { DBStore } from '@picgo/store'
import { T } from '~/main/i18n' import { T } from '~/main/i18n'
import fs from 'fs-extra'
import { cloneDeep } from 'lodash'
// Cross-process support may be required in the future // Cross-process support may be required in the future
class GuiApi implements IGuiApi { class GuiApi implements IGuiApi {
@ -76,11 +78,16 @@ class GuiApi implements IGuiApi {
async upload (input: IUploadOption) { async upload (input: IUploadOption) {
this.windowId = await getWindowId() this.windowId = await getWindowId()
const webContents = this.getWebcontentsByWindowId(this.windowId) const webContents = this.getWebcontentsByWindowId(this.windowId)
const rawInput = cloneDeep(input)
const imgs = await uploader.setWebContents(webContents!).upload(input) const imgs = await uploader.setWebContents(webContents!).upload(input)
if (imgs !== false) { if (imgs !== false) {
const pasteStyle = db.get('settings.pasteStyle') || 'markdown' const pasteStyle = db.get('settings.pasteStyle') || 'markdown'
const deleteLocalFile = db.get('settings.deleteLocalFile') || false
const pasteText: string[] = [] const pasteText: string[] = []
for (let i = 0; i < imgs.length; i++) { for (let i = 0; i < imgs.length; i++) {
if (deleteLocalFile) {
await fs.remove(rawInput[i])
}
pasteText.push(await (pasteTemplate(pasteStyle, imgs[i], db.get('settings.customLink')))) pasteText.push(await (pasteTemplate(pasteStyle, imgs[i], db.get('settings.customLink'))))
const notification = new Notification({ const notification = new Notification({
title: T('UPLOAD_SUCCEED'), title: T('UPLOAD_SUCCEED'),

View File

@ -225,6 +225,16 @@
@change="handleDeleteCloudFile" @change="handleDeleteCloudFile"
/> />
</el-form-item> </el-form-item>
<el-form-item
:label="$T('SETTINGS_DELETE_LOCAL_FILE_AFTER_UPLOAD')"
>
<el-switch
v-model="form.deleteLocalFile"
:active-text="$T('SETTINGS_OPEN')"
:inactive-text="$T('SETTINGS_CLOSE')"
@change="handleDeleteLocalFile"
/>
</el-form-item>
<el-form-item <el-form-item
:label="$T('SETTINGS_RENAME_BEFORE_UPLOAD')" :label="$T('SETTINGS_RENAME_BEFORE_UPLOAD')"
> >
@ -1073,7 +1083,8 @@ const form = reactive<ISettingForm>({
isHideDock: false, isHideDock: false,
encodeOutputURL: true, encodeOutputURL: true,
isAutoListenClipboard: false, isAutoListenClipboard: false,
useShortUrl: false useShortUrl: false,
deleteLocalFile: false
}) })
const languageList = i18nManager.languageList.map(item => ({ const languageList = i18nManager.languageList.map(item => ({
@ -1172,6 +1183,7 @@ async function initData () {
form.customMiniIcon = settings.customMiniIcon || '' form.customMiniIcon = settings.customMiniIcon || ''
form.isHideDock = settings.isHideDock || false form.isHideDock = settings.isHideDock || false
form.useShortUrl = settings.useShortUrl || false form.useShortUrl = settings.useShortUrl || false
form.deleteLocalFile = settings.deleteLocalFile || false
currentLanguage.value = settings.language ?? 'zh-CN' currentLanguage.value = settings.language ?? 'zh-CN'
currentStartMode.value = settings.startMode || 'quiet' currentStartMode.value = settings.startMode || 'quiet'
customLink.value = settings.customLink || '![$fileName]($url)' customLink.value = settings.customLink || '![$fileName]($url)'
@ -1331,6 +1343,12 @@ function handleDeleteCloudFile (val: ICheckBoxValueType) {
}) })
} }
function handleDeleteLocalFile (val: ICheckBoxValueType) {
saveConfig({
'settings.deleteLocalFile': val
})
}
function handleRename (val: ICheckBoxValueType) { function handleRename (val: ICheckBoxValueType) {
saveConfig({ saveConfig({
'settings.rename': val 'settings.rename': val

View File

@ -630,7 +630,6 @@ async function getUseShortUrl () {
} }
async function handleUseShortUrlChange () { async function handleUseShortUrlChange () {
console.log(useShortUrl.value)
saveConfig({ saveConfig({
'settings.useShortUrl': useShortUrl.value 'settings.useShortUrl': useShortUrl.value
}) })

View File

@ -193,6 +193,7 @@ interface ILocales {
SETTINGS_ENCODE_OUTPUT_URL: string SETTINGS_ENCODE_OUTPUT_URL: string
SETTINGS_WATCH_CLIPBOARD: string SETTINGS_WATCH_CLIPBOARD: string
SETTINGS_SHORT_URL: string SETTINGS_SHORT_URL: string
SETTINGS_DELETE_LOCAL_FILE_AFTER_UPLOAD: string
SHORTCUT_NAME: string SHORTCUT_NAME: string
SHORTCUT_BIND: string SHORTCUT_BIND: string
SHORTCUT_STATUS: string SHORTCUT_STATUS: string

View File

@ -18,7 +18,8 @@ interface ISettingForm {
isHideDock: boolean, isHideDock: boolean,
encodeOutputURL: boolean, encodeOutputURL: boolean,
isAutoListenClipboard: boolean, isAutoListenClipboard: boolean,
useShortUrl: boolean useShortUrl: boolean,
deleteLocalFile: boolean
} }
interface IShortKeyMap { interface IShortKeyMap {

View File

@ -11044,10 +11044,10 @@ performance-now@^2.1.0:
resolved "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" resolved "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
piclist@^0.5.1: piclist@^0.5.2:
version "0.5.1" version "0.5.2"
resolved "https://registry.npmjs.org/piclist/-/piclist-0.5.1.tgz#0d2b48c503e3a9eba73b26863c162642b0351b34" resolved "https://registry.npmjs.org/piclist/-/piclist-0.5.2.tgz#bb366e7c07f93b4dbe615ad5e1489647eb8508c7"
integrity sha512-miF3+vunzE7uzAMuTaPoGYjgSrQWBrVLUOYa+V2NK2Y02CZ1d9AiFQMz73DsrQuch8GCXyDoauTpLZFQjbR5Bg== integrity sha512-j3s92ZzalSNjG1xu8doBjojTjWs8o1iRtAUqb0BLFnrtpWZ+91zcp6zb3wTMyKbH7WTXR+X35yYIvoNF/E0cvw==
dependencies: dependencies:
"@picgo/i18n" "^1.0.0" "@picgo/i18n" "^1.0.0"
"@picgo/store" "^2.0.4" "@picgo/store" "^2.0.4"