createUploadFileRecordFromTask 从任务创建上传文件记录(流式处理版本)
(task *UploadTask)
| 611 | |
| 612 | // createUploadFileRecordFromTask 从任务创建上传文件记录(流式处理版本) |
| 613 | func (fp *FileProcessor) createUploadFileRecordFromTask(task *UploadTask) (*model.UploadFile, error) { |
| 614 | // 打开文件 |
| 615 | file, err := task.FileHeader.Open() |
| 616 | if err != nil { |
| 617 | return nil, fmt.Errorf("打开文件失败: %v", err) |
| 618 | } |
| 619 | defer file.Close() |
| 620 | |
| 621 | // 创建临时文件用于流式处理 |
| 622 | tempFile, err := os.CreateTemp("", fmt.Sprintf("upload_%s_*.tmp", task.FileID)) |
| 623 | if err != nil { |
| 624 | return nil, fmt.Errorf("创建临时文件失败: %v", err) |
| 625 | } |
| 626 | defer func() { |
| 627 | tempFile.Close() |
| 628 | os.Remove(tempFile.Name()) |
| 629 | }() |
| 630 | |
| 631 | // 流式复制文件内容到临时文件,避免大文件占用内存 |
| 632 | _, err = io.Copy(tempFile, file) |
| 633 | if err != nil { |
| 634 | return nil, fmt.Errorf("复制文件内容失败: %v", err) |
| 635 | } |
| 636 | |
| 637 | // 重置临时文件指针到开头 |
| 638 | if _, err := tempFile.Seek(0, 0); err != nil { |
| 639 | return nil, fmt.Errorf("重置临时文件指针失败: %v", err) |
| 640 | } |
| 641 | |
| 642 | // 计算文件哈希 |
| 643 | hashStr, err := storage.GetFileHash(tempFile) |
| 644 | if err != nil { |
| 645 | return nil, fmt.Errorf("计算文件哈希失败: %v", err) |
| 646 | } |
| 647 | |
| 648 | // 重置临时文件指针到开头准备读取内容 |
| 649 | if _, err := tempFile.Seek(0, 0); err != nil { |
| 650 | return nil, fmt.Errorf("重置临时文件指针失败: %v", err) |
| 651 | } |
| 652 | |
| 653 | // 读取临时文件内容用于存储 |
| 654 | fileContent, err := io.ReadAll(tempFile) |
| 655 | if err != nil { |
| 656 | return nil, fmt.Errorf("读取临时文件内容失败: %v", err) |
| 657 | } |
| 658 | |
| 659 | extension := filepath.Ext(task.FileHeader.Filename) |
| 660 | previewKey, err := model.GetPreviewKey(hashStr, extension, task.EID) |
| 661 | if err != nil { |
| 662 | return nil, fmt.Errorf("生成预览键失败: %v", err) |
| 663 | } |
| 664 | |
| 665 | key := model.GetFileKey(previewKey, task.EID, task.UserID) |
| 666 | |
| 667 | // 存储文件 |
| 668 | err = storage.StorageInstance.Save(fileContent, key) |
| 669 | if err != nil { |
| 670 | return nil, fmt.Errorf("存储文件失败: %v", err) |