File size: 3,011 Bytes
551658a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import asyncio
from typing import Optional, Dict

# 导入 R2 上传器
from utils.r2_uploader import get_r2_uploader, R2Config


async def save_and_upload_to_r2(
    file,
    company_code: str,
    product_number: str,
    file_type: str,  # 'media' 或 'cert'
    r2_config: Optional[R2Config] = None,
    sub_type: Optional[str] = None  # 认证类型,如 'ce', 'rohs' 等
) -> Dict:
    """
    直接上传文件到 R2(不再保存到本地)
    
    参数:
        file: 上传的文件对象
        company_code: 公司编码
        product_number: 商品货号
        file_type: 文件类型 ('media' 或 'cert')
        r2_config: R2 配置对象(如果为 None,则上传失败)
        sub_type: 子类型(认证类型)
    
    返回:
        dict: {
            'file_path': str,  # 空字符串(保持兼容性)
            'file_name': str,  # 文件名
            'full_path': str,  # 空字符串(保持兼容性)
            'server_url': str,  # 空字符串(保持兼容性)
            'r2_url': str,  # R2 原图 URL(media_url 字段使用)
            'thumbnail_url': str,  # R2 缩略图 URL(thumbnail_path 字段使用)
            'r2_key': str,  # R2 对象键
            'thumbnail_key': str  # R2 缩略图对象键
        }
    """
    # 读取文件内容
    if hasattr(file, 'file'):
        # UploadFile 对象,file.file 是 SpooledTemporaryFile
        file_content = file.file.read()
    else:
        # 其他文件对象
        file_content = file.read()
    
    # 获取原始文件名
    original_filename = getattr(file, 'filename', 'unknown')
    
    # 尝试上传到 R2
    r2_url = ''
    thumbnail_url = ''
    r2_key = ''
    thumbnail_key = ''
    
    if r2_config:
        r2_uploader = get_r2_uploader()
        if r2_uploader.is_available(r2_config):
            try:
                r2_result = await r2_uploader.upload_file(
                    file_buffer=file_content,
                    company_code=company_code,
                    product_number=product_number,
                    file_type=file_type,
                    filename=original_filename,
                    config=r2_config,
                    sub_type=sub_type,
                    generate_thumbnail=(file_type == 'media')
                )
                r2_url = r2_result['r2_url']
                thumbnail_url = r2_result['thumbnail_url']
                r2_key = r2_result['r2_key']
                thumbnail_key = r2_result['thumbnail_key']
            except Exception as e:
                print(f"R2 上传失败: {e}")
                raise
    else:
        print("R2 配置未提供,上传失败")
        raise ValueError("R2 配置未提供")
    
    return {
        'file_path': '',
        'file_name': original_filename,
        'full_path': '',
        'server_url': '',
        'r2_url': r2_url,
        'thumbnail_url': thumbnail_url,
        'r2_key': r2_key,
        'thumbnail_key': thumbnail_key
    }