feat(upload): 添加上传进度显示和错误处理,记录上传耗时

This commit is contained in:
kuaifan 2026-05-22 14:55:34 +08:00
parent 981a5c9f0f
commit 025f45df0a

52
electron/build.js vendored
View File

@ -26,6 +26,7 @@ let buildChecked = false,
updaterChecked = false; updaterChecked = false;
const shellQuote = (value) => `'${String(value).replace(/'/g, `'\\''`)}'`; const shellQuote = (value) => `'${String(value).replace(/'/g, `'\\''`)}'`;
const elapsedSeconds = (startTime) => `${((Date.now() - startTime) / 1000).toFixed(1)}s`;
/** /**
* 检测并下载更新器 * 检测并下载更新器
@ -368,6 +369,7 @@ class WebsitePublisher {
*/ */
async uploadPackage(localFile, options = {}) { async uploadPackage(localFile, options = {}) {
const filename = path.basename(localFile) const filename = path.basename(localFile)
const startTime = Date.now()
let spinner = ora(`Upload [0%] ${filename}`).start() let spinner = ora(`Upload [0%] ${filename}`).start()
const formData = new FormData() const formData = new FormData()
formData.append("version", this.version) formData.append("version", this.version)
@ -378,33 +380,41 @@ class WebsitePublisher {
} }
} }
formData.append("file", fs.createReadStream(localFile)) formData.append("file", fs.createReadStream(localFile))
const {status, data} = await axiosAutoTry({ let result
axios: { try {
method: 'post', result = await axiosAutoTry({
url: `${this.baseUrl}/api/upload/package`, axios: {
data: formData, method: 'post',
headers: { url: `${this.baseUrl}/api/upload/package`,
'Authorization': `Bearer ${this.token}`, data: formData,
'Content-Type': 'multipart/form-data;boundary=' + formData.getBoundary(), headers: {
'Authorization': `Bearer ${this.token}`,
'Content-Type': 'multipart/form-data;boundary=' + formData.getBoundary(),
},
onUploadProgress: progress => {
const complete = Math.min(99, Math.round(progress.loaded / progress.total * 100 | 0)) + '%'
spinner.text = `Upload [${complete}] ${filename}`
},
}, },
onUploadProgress: progress => { onRetry: (err) => {
const complete = Math.min(99, Math.round(progress.loaded / progress.total * 100 | 0)) + '%' const reason = err?.response?.status || err?.code || err?.message || ''
spinner.text = `Upload [${complete}] ${filename}` spinner.warn(`Upload [retry] ${filename} (${elapsedSeconds(startTime)})${reason ? ': ' + reason : ''}`)
spinner = ora(`Upload [0%] ${filename}`).start()
}, },
}, retryNumber: 3
onRetry: (err) => { })
const reason = err?.response?.status || err?.code || err?.message || '' } catch (error) {
spinner.warn(`Upload [retry] ${filename}${reason ? ': ' + reason : ''}`) const reason = error?.response?.status || error?.code || error?.message || 'unknown error'
spinner = ora(`Upload [0%] ${filename}`).start() spinner.fail(`Upload [fail] ${filename} (${elapsedSeconds(startTime)}): ${reason}`)
}, throw error
retryNumber: 3 }
}) const {status, data} = result
if (status !== 200 || !utils.isJson(data) || !data.success) { if (status !== 200 || !utils.isJson(data) || !data.success) {
const reason = data?.message || `status ${status}` const reason = data?.message || `status ${status}`
spinner.fail(`Upload [fail] ${filename}: ${reason}`) spinner.fail(`Upload [fail] ${filename} (${elapsedSeconds(startTime)}): ${reason}`)
throw new Error(`Upload failed: ${filename}: ${reason}`) throw new Error(`Upload failed: ${filename}: ${reason}`)
} }
spinner.succeed(`Upload [100%] ${filename}`) spinner.succeed(`Upload [100%] ${filename} (${elapsedSeconds(startTime)})`)
} }
/** /**