fix upload database read error #263

This commit is contained in:
tickstep
2025-02-27 15:45:55 +08:00
parent acdc2c93ee
commit ce6d0266bf
2 changed files with 51 additions and 1 deletions
@@ -16,6 +16,7 @@ package panupload
import (
"errors"
"github.com/tickstep/library-go/logger"
"io"
"os"
"path/filepath"
"strings"
@@ -48,6 +49,7 @@ type (
func NewUploadingDatabase() (ud *UploadingDatabase, err error) {
file, err := os.OpenFile(filepath.Join(config.GetConfigDir(), UploadingFileName), os.O_CREATE|os.O_RDWR, 0777)
if err != nil {
// 打开文件错误,一般是文件权限问题
return nil, err
}
@@ -65,7 +67,20 @@ func NewUploadingDatabase() (ud *UploadingDatabase, err error) {
err = jsonhelper.UnmarshalData(file, ud)
if err != nil {
return nil, err
// 上传数据库文件内容解析错误
// 尝试从备份的文件读取数据
bakFile, err1 := os.OpenFile(filepath.Join(config.GetConfigDir(), UploadingBackupFileName), os.O_CREATE|os.O_RDONLY, 0777)
if err1 != nil {
return nil, err
}
err2 := jsonhelper.UnmarshalData(bakFile, ud)
if err2 != nil {
return nil, err
}
bakFile.Close()
// 旧的备份文件可以正常使用,复制备份的数据文件到当前数据文件中
ud.copyFile(filepath.Join(config.GetConfigDir(), UploadingFileName), filepath.Join(config.GetConfigDir(), UploadingBackupFileName))
return ud, nil
}
return ud, nil
@@ -87,11 +102,23 @@ func (ud *UploadingDatabase) Save() error {
panic(err)
}
// 备份旧的数据库文件
// 因为下面有文件内容清空、写入新内容的操作。有小概率出现文件保存没有完成程序就退出的问题,这会导致数据库内容丢失。所以这里必须备份一下旧文件
err1 := ud.copyFile(filepath.Join(config.GetConfigDir(), UploadingBackupFileName), filepath.Join(config.GetConfigDir(), UploadingFileName))
if err1 != nil {
logger.Verboseln("备份上传数据库文件出错: {}", err1)
} else {
logger.Verboseln("成功备份旧的上传数据库文件")
}
logger.Verboseln("保存最新上传数据库内容")
// 清空文件旧内容
err = ud.dataFile.Truncate(int64(builder.Len()))
if err != nil {
return err
}
// 写入新内容
str := builder.String()
_, err = ud.dataFile.WriteAt(converter.ToBytes(str), 0)
if err != nil {
@@ -101,6 +128,26 @@ func (ud *UploadingDatabase) Save() error {
return nil
}
// copyFile 复制文件
func (ud *UploadingDatabase) copyFile(dstFilePath string, srcFilePath string) error {
os.Remove(dstFilePath)
dstFile, err1 := os.OpenFile(dstFilePath, os.O_CREATE|os.O_WRONLY, 0777)
if err1 != nil {
return err1
}
srcFile, err2 := os.OpenFile(srcFilePath, os.O_CREATE|os.O_RDONLY, 0777)
if err2 != nil {
return err2
}
_, err3 := io.Copy(dstFile, srcFile)
if err3 != nil {
return err3
}
dstFile.Close()
srcFile.Close()
return nil
}
// UpdateUploading 更新正在上传
func (ud *UploadingDatabase) UpdateUploading(meta *localfile.LocalFileMeta, state *uploader.InstanceState) {
if meta == nil {
+3
View File
@@ -35,7 +35,10 @@ const (
// MaxRapidUploadSize 秒传文件支持的最大文件大小
MaxRapidUploadSize = 20 * converter.GB
// UploadingFileName 上传文件上传状态的文件名
UploadingFileName = "aliyunpan_uploading.json"
// UploadingBackupFileName 上传文件上传状态的副本
UploadingBackupFileName = "aliyunpan_uploading.json.bak"
)
var (