tamar-file-hub-client 0.1.1__tar.gz → 0.1.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/PKG-INFO +163 -1
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/README.md +162 -0
- tamar_file_hub_client-0.1.3/file_hub_client/rpc/gen/file_service_pb2.py +92 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/rpc/protos/file_service.proto +5 -1
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/schemas/__init__.py +2 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/schemas/file.py +7 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/file/async_blob_service.py +27 -4
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/file/sync_blob_service.py +27 -4
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/setup.py +1 -1
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/tamar_file_hub_client.egg-info/PKG-INFO +163 -1
- tamar_file_hub_client-0.1.1/file_hub_client/rpc/gen/file_service_pb2.py +0 -92
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/MANIFEST.in +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/__init__.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/client.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/enums/__init__.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/enums/export_format.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/enums/role.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/enums/upload_mode.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/errors/__init__.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/errors/exceptions.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/py.typed +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/rpc/__init__.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/rpc/async_client.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/rpc/gen/__init__.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/rpc/gen/file_service_pb2_grpc.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/rpc/gen/folder_service_pb2.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/rpc/gen/folder_service_pb2_grpc.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/rpc/gen/taple_service_pb2.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/rpc/gen/taple_service_pb2_grpc.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/rpc/interceptors.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/rpc/protos/folder_service.proto +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/rpc/protos/taple_service.proto +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/rpc/sync_client.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/schemas/context.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/schemas/folder.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/schemas/taple.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/__init__.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/file/__init__.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/file/async_file_service.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/file/base_file_service.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/file/sync_file_service.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/folder/__init__.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/folder/async_folder_service.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/folder/sync_folder_service.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/taple/__init__.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/taple/async_taple_service.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/taple/base_taple_service.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/taple/idempotent_taple_mixin.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/services/taple/sync_taple_service.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/utils/__init__.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/utils/converter.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/utils/download_helper.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/utils/file_utils.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/utils/idempotency.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/utils/logging.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/utils/retry.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/utils/smart_retry.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/utils/upload_helper.py +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/setup.cfg +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/tamar_file_hub_client.egg-info/SOURCES.txt +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/tamar_file_hub_client.egg-info/dependency_links.txt +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/tamar_file_hub_client.egg-info/requires.txt +0 -0
- {tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/tamar_file_hub_client.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: tamar-file-hub-client
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.3
|
4
4
|
Summary: A Python SDK for gRPC-based file management system
|
5
5
|
Home-page: https://github.com/Tamar-Edge-AI/file-hub-client
|
6
6
|
Author: Oscar Ou
|
@@ -641,6 +641,30 @@ async with AsyncTamarFileHubClient() as client:
|
|
641
641
|
)
|
642
642
|
```
|
643
643
|
|
644
|
+
#### 保留原始文件名上传
|
645
|
+
|
646
|
+
```python
|
647
|
+
from file_hub_client import AsyncTamarFileHubClient
|
648
|
+
|
649
|
+
async with AsyncTamarFileHubClient() as client:
|
650
|
+
# 设置用户上下文
|
651
|
+
client.set_user_context(org_id="123", user_id="456")
|
652
|
+
|
653
|
+
# 上传时保留原始文件名
|
654
|
+
file_info = await client.blobs.upload(
|
655
|
+
"document.pdf",
|
656
|
+
keep_original_filename=True # 保留原始文件名,默认为False
|
657
|
+
)
|
658
|
+
|
659
|
+
# 也可以指定文件夹和其他参数
|
660
|
+
file_info = await client.blobs.upload(
|
661
|
+
"report.xlsx",
|
662
|
+
folder_id="folder-123",
|
663
|
+
keep_original_filename=True, # 保留原始文件名
|
664
|
+
is_temporary=False
|
665
|
+
)
|
666
|
+
```
|
667
|
+
|
644
668
|
### 文件下载
|
645
669
|
|
646
670
|
File Hub Client 提供了统一的下载接口,支持两种结构返回:
|
@@ -682,6 +706,137 @@ async with AsyncTamarFileHubClient() as client:
|
|
682
706
|
print(f"文件已保存到: {save_path}")
|
683
707
|
```
|
684
708
|
|
709
|
+
#### 高级下载功能
|
710
|
+
|
711
|
+
File Hub Client 提供了高级的下载URL管理功能,支持批量操作和直接获取GCS URL:
|
712
|
+
|
713
|
+
##### 批量生成下载URL
|
714
|
+
|
715
|
+
当需要为多个文件生成下载URL时,使用批量接口可以显著提高效率:
|
716
|
+
|
717
|
+
```python
|
718
|
+
from file_hub_client import AsyncTamarFileHubClient
|
719
|
+
|
720
|
+
async with AsyncTamarFileHubClient() as client:
|
721
|
+
# 设置用户上下文
|
722
|
+
client.set_user_context(org_id="123", user_id="456")
|
723
|
+
|
724
|
+
# 批量生成下载URL
|
725
|
+
file_ids = ["file-001", "file-002", "file-003"]
|
726
|
+
|
727
|
+
result = await client.blobs.batch_generate_download_url(
|
728
|
+
file_ids=file_ids,
|
729
|
+
is_cdn=True, # 使用CDN加速(可选,默认为True)
|
730
|
+
expire_seconds=3600 # URL有效期1小时(可选)
|
731
|
+
)
|
732
|
+
|
733
|
+
# 处理结果
|
734
|
+
for url_info in result.download_urls:
|
735
|
+
if url_info.error:
|
736
|
+
print(f"文件 {url_info.file_id} 生成URL失败: {url_info.error}")
|
737
|
+
else:
|
738
|
+
print(f"文件 {url_info.file_id} 的下载URL: {url_info.url}")
|
739
|
+
```
|
740
|
+
|
741
|
+
同步客户端示例:
|
742
|
+
|
743
|
+
```python
|
744
|
+
from file_hub_client import TamarFileHubClient
|
745
|
+
|
746
|
+
with TamarFileHubClient() as client:
|
747
|
+
client.set_user_context(org_id="123", user_id="456")
|
748
|
+
|
749
|
+
result = client.blobs.batch_generate_download_url(
|
750
|
+
file_ids=["file-001", "file-002"],
|
751
|
+
is_cdn=False # 不使用CDN,直接返回源站URL
|
752
|
+
)
|
753
|
+
```
|
754
|
+
|
755
|
+
##### 获取GCS URL
|
756
|
+
|
757
|
+
对于需要直接访问Google Cloud Storage的场景,可以获取文件的GCS URL和MIME类型信息:
|
758
|
+
|
759
|
+
```python
|
760
|
+
# 异步客户端 - 获取单个文件的GCS URL
|
761
|
+
async with AsyncTamarFileHubClient() as client:
|
762
|
+
client.set_user_context(org_id="123", user_id="456")
|
763
|
+
|
764
|
+
gcs_response = await client.blobs.get_gcs_url(file_id="file-001")
|
765
|
+
print(f"GCS URL: {gcs_response.gcs_url}")
|
766
|
+
print(f"MIME类型: {gcs_response.mime_type}")
|
767
|
+
# 输出示例:
|
768
|
+
# GCS URL: gs://bucket-name/path/to/file.pdf
|
769
|
+
# MIME类型: application/pdf
|
770
|
+
```
|
771
|
+
|
772
|
+
**注意**:`get_gcs_url` 方法现在返回一个 `GetGcsUrlResponse` 对象,包含:
|
773
|
+
- `gcs_url`: Google Cloud Storage 的完整路径
|
774
|
+
- `mime_type`: 文件的MIME类型,便于正确处理文件内容
|
775
|
+
|
776
|
+
##### 批量获取GCS URL
|
777
|
+
|
778
|
+
批量获取多个文件的GCS URL和MIME类型信息:
|
779
|
+
|
780
|
+
```python
|
781
|
+
# 异步客户端 - 批量获取GCS URL
|
782
|
+
async with AsyncTamarFileHubClient() as client:
|
783
|
+
client.set_user_context(org_id="123", user_id="456")
|
784
|
+
|
785
|
+
file_ids = ["file-001", "file-002", "file-003"]
|
786
|
+
result = await client.blobs.batch_get_gcs_url(file_ids)
|
787
|
+
|
788
|
+
# 处理结果
|
789
|
+
for url_info in result.gcs_urls:
|
790
|
+
if url_info.error:
|
791
|
+
print(f"文件 {url_info.file_id} 获取GCS URL失败: {url_info.error}")
|
792
|
+
else:
|
793
|
+
print(f"文件 {url_info.file_id}:")
|
794
|
+
print(f" GCS URL: {url_info.gcs_url}")
|
795
|
+
print(f" MIME类型: {url_info.mime_type}")
|
796
|
+
# 根据MIME类型处理文件
|
797
|
+
if url_info.mime_type.startswith('image/'):
|
798
|
+
print(f" 这是一个图片文件")
|
799
|
+
elif url_info.mime_type == 'application/pdf':
|
800
|
+
print(f" 这是一个PDF文件")
|
801
|
+
```
|
802
|
+
|
803
|
+
同步客户端示例:
|
804
|
+
|
805
|
+
```python
|
806
|
+
# 同步客户端 - 批量获取GCS URL
|
807
|
+
with TamarFileHubClient() as client:
|
808
|
+
client.set_user_context(org_id="123", user_id="456")
|
809
|
+
|
810
|
+
# 获取单个GCS URL
|
811
|
+
gcs_response = client.blobs.get_gcs_url(file_id="file-001")
|
812
|
+
print(f"GCS URL: {gcs_response.gcs_url}")
|
813
|
+
print(f"MIME类型: {gcs_response.mime_type}")
|
814
|
+
|
815
|
+
# 批量获取GCS URL
|
816
|
+
result = client.blobs.batch_get_gcs_url(["file-001", "file-002"])
|
817
|
+
```
|
818
|
+
|
819
|
+
##### 使用场景说明
|
820
|
+
|
821
|
+
1. **批量下载URL生成**:
|
822
|
+
- 适用于需要同时下载多个文件的场景
|
823
|
+
- 支持CDN加速,提供更好的下载体验
|
824
|
+
- 可设置URL有效期,增强安全性
|
825
|
+
- 批量操作减少网络往返,提高效率
|
826
|
+
|
827
|
+
2. **GCS URL获取**:
|
828
|
+
- 适用于需要与Google Cloud服务集成的场景
|
829
|
+
- 可用于数据分析、批处理等后端处理
|
830
|
+
- 支持使用GCS工具进行文件操作
|
831
|
+
- 返回的是永久有效的存储路径
|
832
|
+
- 同时返回MIME类型信息,便于正确处理不同类型的文件
|
833
|
+
- 可根据MIME类型选择合适的处理方式(如图片处理、文档解析等)
|
834
|
+
|
835
|
+
3. **错误处理**:
|
836
|
+
- 每个文件独立处理,部分失败不影响其他文件
|
837
|
+
- 错误信息通过 `error` 字段返回
|
838
|
+
- 建议在批量操作时做好错误处理和重试逻辑
|
839
|
+
|
685
840
|
### 文件管理操作
|
686
841
|
|
687
842
|
File Hub Client 提供了完整的文件管理功能,通过 `files` 服务访问:
|
@@ -2019,6 +2174,13 @@ MIT License
|
|
2019
2174
|
|
2020
2175
|
## 更新日志
|
2021
2176
|
|
2177
|
+
### v0.0.5 (2025-01)
|
2178
|
+
- 新增批量下载URL生成接口 (batch_generate_download_url)
|
2179
|
+
- 新增GCS URL获取接口 (get_gcs_url, batch_get_gcs_url)
|
2180
|
+
- GCS URL接口返回MIME类型信息,便于文件类型识别
|
2181
|
+
- 新增 keep_original_filename 参数支持保留原始文件名
|
2182
|
+
- 更新相关文档和测试用例
|
2183
|
+
|
2022
2184
|
### v0.0.4 (2025-01)
|
2023
2185
|
- 新增从URL上传文件功能
|
2024
2186
|
- 支持自动下载URL内容并上传到GCS
|
@@ -595,6 +595,30 @@ async with AsyncTamarFileHubClient() as client:
|
|
595
595
|
)
|
596
596
|
```
|
597
597
|
|
598
|
+
#### 保留原始文件名上传
|
599
|
+
|
600
|
+
```python
|
601
|
+
from file_hub_client import AsyncTamarFileHubClient
|
602
|
+
|
603
|
+
async with AsyncTamarFileHubClient() as client:
|
604
|
+
# 设置用户上下文
|
605
|
+
client.set_user_context(org_id="123", user_id="456")
|
606
|
+
|
607
|
+
# 上传时保留原始文件名
|
608
|
+
file_info = await client.blobs.upload(
|
609
|
+
"document.pdf",
|
610
|
+
keep_original_filename=True # 保留原始文件名,默认为False
|
611
|
+
)
|
612
|
+
|
613
|
+
# 也可以指定文件夹和其他参数
|
614
|
+
file_info = await client.blobs.upload(
|
615
|
+
"report.xlsx",
|
616
|
+
folder_id="folder-123",
|
617
|
+
keep_original_filename=True, # 保留原始文件名
|
618
|
+
is_temporary=False
|
619
|
+
)
|
620
|
+
```
|
621
|
+
|
598
622
|
### 文件下载
|
599
623
|
|
600
624
|
File Hub Client 提供了统一的下载接口,支持两种结构返回:
|
@@ -636,6 +660,137 @@ async with AsyncTamarFileHubClient() as client:
|
|
636
660
|
print(f"文件已保存到: {save_path}")
|
637
661
|
```
|
638
662
|
|
663
|
+
#### 高级下载功能
|
664
|
+
|
665
|
+
File Hub Client 提供了高级的下载URL管理功能,支持批量操作和直接获取GCS URL:
|
666
|
+
|
667
|
+
##### 批量生成下载URL
|
668
|
+
|
669
|
+
当需要为多个文件生成下载URL时,使用批量接口可以显著提高效率:
|
670
|
+
|
671
|
+
```python
|
672
|
+
from file_hub_client import AsyncTamarFileHubClient
|
673
|
+
|
674
|
+
async with AsyncTamarFileHubClient() as client:
|
675
|
+
# 设置用户上下文
|
676
|
+
client.set_user_context(org_id="123", user_id="456")
|
677
|
+
|
678
|
+
# 批量生成下载URL
|
679
|
+
file_ids = ["file-001", "file-002", "file-003"]
|
680
|
+
|
681
|
+
result = await client.blobs.batch_generate_download_url(
|
682
|
+
file_ids=file_ids,
|
683
|
+
is_cdn=True, # 使用CDN加速(可选,默认为True)
|
684
|
+
expire_seconds=3600 # URL有效期1小时(可选)
|
685
|
+
)
|
686
|
+
|
687
|
+
# 处理结果
|
688
|
+
for url_info in result.download_urls:
|
689
|
+
if url_info.error:
|
690
|
+
print(f"文件 {url_info.file_id} 生成URL失败: {url_info.error}")
|
691
|
+
else:
|
692
|
+
print(f"文件 {url_info.file_id} 的下载URL: {url_info.url}")
|
693
|
+
```
|
694
|
+
|
695
|
+
同步客户端示例:
|
696
|
+
|
697
|
+
```python
|
698
|
+
from file_hub_client import TamarFileHubClient
|
699
|
+
|
700
|
+
with TamarFileHubClient() as client:
|
701
|
+
client.set_user_context(org_id="123", user_id="456")
|
702
|
+
|
703
|
+
result = client.blobs.batch_generate_download_url(
|
704
|
+
file_ids=["file-001", "file-002"],
|
705
|
+
is_cdn=False # 不使用CDN,直接返回源站URL
|
706
|
+
)
|
707
|
+
```
|
708
|
+
|
709
|
+
##### 获取GCS URL
|
710
|
+
|
711
|
+
对于需要直接访问Google Cloud Storage的场景,可以获取文件的GCS URL和MIME类型信息:
|
712
|
+
|
713
|
+
```python
|
714
|
+
# 异步客户端 - 获取单个文件的GCS URL
|
715
|
+
async with AsyncTamarFileHubClient() as client:
|
716
|
+
client.set_user_context(org_id="123", user_id="456")
|
717
|
+
|
718
|
+
gcs_response = await client.blobs.get_gcs_url(file_id="file-001")
|
719
|
+
print(f"GCS URL: {gcs_response.gcs_url}")
|
720
|
+
print(f"MIME类型: {gcs_response.mime_type}")
|
721
|
+
# 输出示例:
|
722
|
+
# GCS URL: gs://bucket-name/path/to/file.pdf
|
723
|
+
# MIME类型: application/pdf
|
724
|
+
```
|
725
|
+
|
726
|
+
**注意**:`get_gcs_url` 方法现在返回一个 `GetGcsUrlResponse` 对象,包含:
|
727
|
+
- `gcs_url`: Google Cloud Storage 的完整路径
|
728
|
+
- `mime_type`: 文件的MIME类型,便于正确处理文件内容
|
729
|
+
|
730
|
+
##### 批量获取GCS URL
|
731
|
+
|
732
|
+
批量获取多个文件的GCS URL和MIME类型信息:
|
733
|
+
|
734
|
+
```python
|
735
|
+
# 异步客户端 - 批量获取GCS URL
|
736
|
+
async with AsyncTamarFileHubClient() as client:
|
737
|
+
client.set_user_context(org_id="123", user_id="456")
|
738
|
+
|
739
|
+
file_ids = ["file-001", "file-002", "file-003"]
|
740
|
+
result = await client.blobs.batch_get_gcs_url(file_ids)
|
741
|
+
|
742
|
+
# 处理结果
|
743
|
+
for url_info in result.gcs_urls:
|
744
|
+
if url_info.error:
|
745
|
+
print(f"文件 {url_info.file_id} 获取GCS URL失败: {url_info.error}")
|
746
|
+
else:
|
747
|
+
print(f"文件 {url_info.file_id}:")
|
748
|
+
print(f" GCS URL: {url_info.gcs_url}")
|
749
|
+
print(f" MIME类型: {url_info.mime_type}")
|
750
|
+
# 根据MIME类型处理文件
|
751
|
+
if url_info.mime_type.startswith('image/'):
|
752
|
+
print(f" 这是一个图片文件")
|
753
|
+
elif url_info.mime_type == 'application/pdf':
|
754
|
+
print(f" 这是一个PDF文件")
|
755
|
+
```
|
756
|
+
|
757
|
+
同步客户端示例:
|
758
|
+
|
759
|
+
```python
|
760
|
+
# 同步客户端 - 批量获取GCS URL
|
761
|
+
with TamarFileHubClient() as client:
|
762
|
+
client.set_user_context(org_id="123", user_id="456")
|
763
|
+
|
764
|
+
# 获取单个GCS URL
|
765
|
+
gcs_response = client.blobs.get_gcs_url(file_id="file-001")
|
766
|
+
print(f"GCS URL: {gcs_response.gcs_url}")
|
767
|
+
print(f"MIME类型: {gcs_response.mime_type}")
|
768
|
+
|
769
|
+
# 批量获取GCS URL
|
770
|
+
result = client.blobs.batch_get_gcs_url(["file-001", "file-002"])
|
771
|
+
```
|
772
|
+
|
773
|
+
##### 使用场景说明
|
774
|
+
|
775
|
+
1. **批量下载URL生成**:
|
776
|
+
- 适用于需要同时下载多个文件的场景
|
777
|
+
- 支持CDN加速,提供更好的下载体验
|
778
|
+
- 可设置URL有效期,增强安全性
|
779
|
+
- 批量操作减少网络往返,提高效率
|
780
|
+
|
781
|
+
2. **GCS URL获取**:
|
782
|
+
- 适用于需要与Google Cloud服务集成的场景
|
783
|
+
- 可用于数据分析、批处理等后端处理
|
784
|
+
- 支持使用GCS工具进行文件操作
|
785
|
+
- 返回的是永久有效的存储路径
|
786
|
+
- 同时返回MIME类型信息,便于正确处理不同类型的文件
|
787
|
+
- 可根据MIME类型选择合适的处理方式(如图片处理、文档解析等)
|
788
|
+
|
789
|
+
3. **错误处理**:
|
790
|
+
- 每个文件独立处理,部分失败不影响其他文件
|
791
|
+
- 错误信息通过 `error` 字段返回
|
792
|
+
- 建议在批量操作时做好错误处理和重试逻辑
|
793
|
+
|
639
794
|
### 文件管理操作
|
640
795
|
|
641
796
|
File Hub Client 提供了完整的文件管理功能,通过 `files` 服务访问:
|
@@ -1973,6 +2128,13 @@ MIT License
|
|
1973
2128
|
|
1974
2129
|
## 更新日志
|
1975
2130
|
|
2131
|
+
### v0.0.5 (2025-01)
|
2132
|
+
- 新增批量下载URL生成接口 (batch_generate_download_url)
|
2133
|
+
- 新增GCS URL获取接口 (get_gcs_url, batch_get_gcs_url)
|
2134
|
+
- GCS URL接口返回MIME类型信息,便于文件类型识别
|
2135
|
+
- 新增 keep_original_filename 参数支持保留原始文件名
|
2136
|
+
- 更新相关文档和测试用例
|
2137
|
+
|
1976
2138
|
### v0.0.4 (2025-01)
|
1977
2139
|
- 新增从URL上传文件功能
|
1978
2140
|
- 支持自动下载URL内容并上传到GCS
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
3
|
+
# NO CHECKED-IN PROTOBUF GENCODE
|
4
|
+
# source: file_service.proto
|
5
|
+
# Protobuf Python Version: 5.27.2
|
6
|
+
"""Generated protocol buffer code."""
|
7
|
+
from google.protobuf import descriptor as _descriptor
|
8
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
9
|
+
from google.protobuf import runtime_version as _runtime_version
|
10
|
+
from google.protobuf import symbol_database as _symbol_database
|
11
|
+
from google.protobuf.internal import builder as _builder
|
12
|
+
_runtime_version.ValidateProtobufRuntimeVersion(
|
13
|
+
_runtime_version.Domain.PUBLIC,
|
14
|
+
5,
|
15
|
+
27,
|
16
|
+
2,
|
17
|
+
'',
|
18
|
+
'file_service.proto'
|
19
|
+
)
|
20
|
+
# @@protoc_insertion_point(imports)
|
21
|
+
|
22
|
+
_sym_db = _symbol_database.Default()
|
23
|
+
|
24
|
+
|
25
|
+
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
|
26
|
+
from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
|
27
|
+
|
28
|
+
|
29
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12\x66ile_service.proto\x12\x04\x66ile\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\"\xab\x01\n\x04\x46ile\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tfolder_id\x18\x02 \x01(\t\x12\x11\n\tfile_name\x18\x03 \x01(\t\x12\x11\n\tfile_type\x18\x04 \x01(\t\x12.\n\ncreated_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_at\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xb7\x02\n\nUploadFile\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tfolder_id\x18\x02 \x01(\t\x12\x0f\n\x07\x66ile_id\x18\x03 \x01(\t\x12\x14\n\x0cstorage_type\x18\x04 \x01(\t\x12\x13\n\x0bstored_name\x18\x05 \x01(\t\x12\x13\n\x0bstored_path\x18\x06 \x01(\t\x12\x11\n\tfile_name\x18\x07 \x01(\t\x12\x11\n\tfile_size\x18\x08 \x01(\x03\x12\x10\n\x08\x66ile_ext\x18\t \x01(\t\x12\x11\n\tmime_type\x18\n \x01(\t\x12\x0e\n\x06status\x18\x0b \x01(\t\x12.\n\ncreated_at\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_at\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x9f\x02\n\x11UploadFileRequest\x12\x16\n\tfolder_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x11\n\tfile_name\x18\x02 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x03 \x01(\x0c\x12\x11\n\tfile_type\x18\x04 \x01(\t\x12\x11\n\tmime_type\x18\x05 \x01(\t\x12\x19\n\x0cis_temporary\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x1b\n\x0e\x65xpire_seconds\x18\x07 \x01(\x05H\x02\x88\x01\x01\x12#\n\x16keep_original_filename\x18\x08 \x01(\x08H\x03\x88\x01\x01\x42\x0c\n\n_folder_idB\x0f\n\r_is_temporaryB\x11\n\x0f_expire_secondsB\x19\n\x17_keep_original_filename\"\xb3\x02\n\x10UploadUrlRequest\x12\x16\n\tfolder_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x11\n\tfile_name\x18\x02 \x01(\t\x12\x11\n\tfile_type\x18\x03 \x01(\t\x12\x11\n\tmime_type\x18\x04 \x01(\t\x12\x11\n\tfile_size\x18\x05 \x01(\x03\x12\x11\n\tfile_hash\x18\x06 \x01(\t\x12\x19\n\x0cis_temporary\x18\x07 \x01(\x08H\x01\x88\x01\x01\x12\x1b\n\x0e\x65xpire_seconds\x18\x08 \x01(\x05H\x02\x88\x01\x01\x12#\n\x16keep_original_filename\x18\t \x01(\x08H\x03\x88\x01\x01\x42\x0c\n\n_folder_idB\x0f\n\r_is_temporaryB\x11\n\x0f_expire_secondsB\x19\n\x17_keep_original_filename\")\n\x16UploadCompletedRequest\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\"u\n\x12\x44ownloadUrlRequest\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\x12\x13\n\x06is_cdn\x18\x03 \x01(\x08H\x00\x88\x01\x01\x12\x1b\n\x0e\x65xpire_seconds\x18\x02 \x01(\x05H\x01\x88\x01\x01\x42\t\n\x07_is_cdnB\x11\n\x0f_expire_seconds\"\xd4\x01\n\x10ShareLinkRequest\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\x12\x11\n\tis_public\x18\x02 \x01(\x08\x12\x14\n\x0c\x61\x63\x63\x65ss_scope\x18\x03 \x01(\t\x12\x1b\n\x0e\x65xpire_seconds\x18\x04 \x01(\x05H\x00\x88\x01\x01\x12\x17\n\nmax_access\x18\x05 \x01(\x05H\x01\x88\x01\x01\x12\x1b\n\x0eshare_password\x18\x06 \x01(\tH\x02\x88\x01\x01\x42\x11\n\x0f_expire_secondsB\r\n\x0b_max_accessB\x11\n\x0f_share_password\"\x82\x01\n\x10\x46ileVisitRequest\x12\x15\n\rfile_share_id\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63\x63\x65ss_type\x18\x02 \x01(\t\x12\x17\n\x0f\x61\x63\x63\x65ss_duration\x18\x03 \x01(\x05\x12)\n\x08metadata\x18\x04 \x01(\x0b\x32\x17.google.protobuf.Struct\"!\n\x0eGetFileRequest\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\"6\n\x11RenameFileRequest\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"$\n\x11\x44\x65leteFileRequest\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\"\x8d\x02\n\x10ListFilesRequest\x12\x16\n\tfolder_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tfile_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x11\n\tfile_type\x18\x03 \x03(\t\x12\x1c\n\x0f\x63reated_by_role\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x17\n\ncreated_by\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tpage_size\x18\x06 \x01(\x05H\x04\x88\x01\x01\x12\x11\n\x04page\x18\x07 \x01(\x05H\x05\x88\x01\x01\x42\x0c\n\n_folder_idB\x0c\n\n_file_nameB\x12\n\x10_created_by_roleB\r\n\x0b_created_byB\x0c\n\n_page_sizeB\x07\n\x05_page\"{\n\x17\x42\x61tchDownloadUrlRequest\x12\x10\n\x08\x66ile_ids\x18\x01 \x03(\t\x12\x13\n\x06is_cdn\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x1b\n\x0e\x65xpire_seconds\x18\x03 \x01(\x05H\x01\x88\x01\x01\x42\t\n\x07_is_cdnB\x11\n\x0f_expire_seconds\"#\n\x10GetGcsUrlRequest\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\")\n\x15\x42\x61tchGetGcsUrlRequest\x12\x10\n\x08\x66ile_ids\x18\x01 \x03(\t\"U\n\x12UploadFileResponse\x12\x18\n\x04\x66ile\x18\x01 \x01(\x0b\x32\n.file.File\x12%\n\x0bupload_file\x18\x02 \x01(\x0b\x32\x10.file.UploadFile\"a\n\x11UploadUrlResponse\x12\x18\n\x04\x66ile\x18\x01 \x01(\x0b\x32\n.file.File\x12%\n\x0bupload_file\x18\x02 \x01(\x0b\x32\x10.file.UploadFile\x12\x0b\n\x03url\x18\x03 \x01(\t\"\"\n\x13\x44ownloadUrlResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\"*\n\x11ShareLinkResponse\x12\x15\n\rfile_share_id\x18\x01 \x01(\t\"-\n\x10\x46ileListResponse\x12\x19\n\x05\x66iles\x18\x01 \x03(\x0b\x32\n.file.File\"g\n\x0fGetFileResponse\x12\x18\n\x04\x66ile\x18\x01 \x01(\x0b\x32\n.file.File\x12*\n\x0bupload_file\x18\x02 \x01(\x0b\x32\x10.file.UploadFileH\x00\x88\x01\x01\x42\x0e\n\x0c_upload_file\"H\n\x18\x42\x61tchDownloadUrlResponse\x12,\n\rdownload_urls\x18\x01 \x03(\x0b\x32\x15.file.DownloadUrlInfo\"M\n\x0f\x44ownloadUrlInfo\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\x12\x12\n\x05\x65rror\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error\"7\n\x11GetGcsUrlResponse\x12\x0f\n\x07gcs_url\x18\x01 \x01(\t\x12\x11\n\tmime_type\x18\x02 \x01(\t\"<\n\x16\x42\x61tchGetGcsUrlResponse\x12\"\n\x08gcs_urls\x18\x01 \x03(\x0b\x32\x10.file.GcsUrlInfo\"_\n\nGcsUrlInfo\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\x12\x0f\n\x07gcs_url\x18\x02 \x01(\t\x12\x11\n\tmime_type\x18\x03 \x01(\t\x12\x12\n\x05\x65rror\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error\"\x07\n\x05\x45mpty2\xae\x07\n\x0b\x46ileService\x12?\n\nUploadFile\x12\x17.file.UploadFileRequest\x1a\x18.file.UploadFileResponse\x12\x44\n\x11GenerateUploadUrl\x12\x16.file.UploadUrlRequest\x1a\x17.file.UploadUrlResponse\x12M\n\x1aGenerateResumableUploadUrl\x12\x16.file.UploadUrlRequest\x1a\x17.file.UploadUrlResponse\x12\x43\n\x16\x43onfirmUploadCompleted\x12\x1c.file.UploadCompletedRequest\x1a\x0b.file.Empty\x12J\n\x13GenerateDownloadUrl\x12\x18.file.DownloadUrlRequest\x1a\x19.file.DownloadUrlResponse\x12Y\n\x18\x42\x61tchGenerateDownloadUrl\x12\x1d.file.BatchDownloadUrlRequest\x1a\x1e.file.BatchDownloadUrlResponse\x12<\n\tGetGcsUrl\x12\x16.file.GetGcsUrlRequest\x1a\x17.file.GetGcsUrlResponse\x12K\n\x0e\x42\x61tchGetGcsUrl\x12\x1b.file.BatchGetGcsUrlRequest\x1a\x1c.file.BatchGetGcsUrlResponse\x12\x44\n\x11GenerateShareLink\x12\x16.file.ShareLinkRequest\x1a\x17.file.ShareLinkResponse\x12\x30\n\tVisitFile\x12\x16.file.FileVisitRequest\x1a\x0b.file.Empty\x12\x36\n\x07GetFile\x12\x14.file.GetFileRequest\x1a\x15.file.GetFileResponse\x12\x31\n\nRenameFile\x12\x17.file.RenameFileRequest\x1a\n.file.File\x12\x32\n\nDeleteFile\x12\x17.file.DeleteFileRequest\x1a\x0b.file.Empty\x12;\n\tListFiles\x12\x16.file.ListFilesRequest\x1a\x16.file.FileListResponseb\x06proto3')
|
30
|
+
|
31
|
+
_globals = globals()
|
32
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
33
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'file_service_pb2', _globals)
|
34
|
+
if not _descriptor._USE_C_DESCRIPTORS:
|
35
|
+
DESCRIPTOR._loaded_options = None
|
36
|
+
_globals['_FILE']._serialized_start=92
|
37
|
+
_globals['_FILE']._serialized_end=263
|
38
|
+
_globals['_UPLOADFILE']._serialized_start=266
|
39
|
+
_globals['_UPLOADFILE']._serialized_end=577
|
40
|
+
_globals['_UPLOADFILEREQUEST']._serialized_start=580
|
41
|
+
_globals['_UPLOADFILEREQUEST']._serialized_end=867
|
42
|
+
_globals['_UPLOADURLREQUEST']._serialized_start=870
|
43
|
+
_globals['_UPLOADURLREQUEST']._serialized_end=1177
|
44
|
+
_globals['_UPLOADCOMPLETEDREQUEST']._serialized_start=1179
|
45
|
+
_globals['_UPLOADCOMPLETEDREQUEST']._serialized_end=1220
|
46
|
+
_globals['_DOWNLOADURLREQUEST']._serialized_start=1222
|
47
|
+
_globals['_DOWNLOADURLREQUEST']._serialized_end=1339
|
48
|
+
_globals['_SHARELINKREQUEST']._serialized_start=1342
|
49
|
+
_globals['_SHARELINKREQUEST']._serialized_end=1554
|
50
|
+
_globals['_FILEVISITREQUEST']._serialized_start=1557
|
51
|
+
_globals['_FILEVISITREQUEST']._serialized_end=1687
|
52
|
+
_globals['_GETFILEREQUEST']._serialized_start=1689
|
53
|
+
_globals['_GETFILEREQUEST']._serialized_end=1722
|
54
|
+
_globals['_RENAMEFILEREQUEST']._serialized_start=1724
|
55
|
+
_globals['_RENAMEFILEREQUEST']._serialized_end=1778
|
56
|
+
_globals['_DELETEFILEREQUEST']._serialized_start=1780
|
57
|
+
_globals['_DELETEFILEREQUEST']._serialized_end=1816
|
58
|
+
_globals['_LISTFILESREQUEST']._serialized_start=1819
|
59
|
+
_globals['_LISTFILESREQUEST']._serialized_end=2088
|
60
|
+
_globals['_BATCHDOWNLOADURLREQUEST']._serialized_start=2090
|
61
|
+
_globals['_BATCHDOWNLOADURLREQUEST']._serialized_end=2213
|
62
|
+
_globals['_GETGCSURLREQUEST']._serialized_start=2215
|
63
|
+
_globals['_GETGCSURLREQUEST']._serialized_end=2250
|
64
|
+
_globals['_BATCHGETGCSURLREQUEST']._serialized_start=2252
|
65
|
+
_globals['_BATCHGETGCSURLREQUEST']._serialized_end=2293
|
66
|
+
_globals['_UPLOADFILERESPONSE']._serialized_start=2295
|
67
|
+
_globals['_UPLOADFILERESPONSE']._serialized_end=2380
|
68
|
+
_globals['_UPLOADURLRESPONSE']._serialized_start=2382
|
69
|
+
_globals['_UPLOADURLRESPONSE']._serialized_end=2479
|
70
|
+
_globals['_DOWNLOADURLRESPONSE']._serialized_start=2481
|
71
|
+
_globals['_DOWNLOADURLRESPONSE']._serialized_end=2515
|
72
|
+
_globals['_SHARELINKRESPONSE']._serialized_start=2517
|
73
|
+
_globals['_SHARELINKRESPONSE']._serialized_end=2559
|
74
|
+
_globals['_FILELISTRESPONSE']._serialized_start=2561
|
75
|
+
_globals['_FILELISTRESPONSE']._serialized_end=2606
|
76
|
+
_globals['_GETFILERESPONSE']._serialized_start=2608
|
77
|
+
_globals['_GETFILERESPONSE']._serialized_end=2711
|
78
|
+
_globals['_BATCHDOWNLOADURLRESPONSE']._serialized_start=2713
|
79
|
+
_globals['_BATCHDOWNLOADURLRESPONSE']._serialized_end=2785
|
80
|
+
_globals['_DOWNLOADURLINFO']._serialized_start=2787
|
81
|
+
_globals['_DOWNLOADURLINFO']._serialized_end=2864
|
82
|
+
_globals['_GETGCSURLRESPONSE']._serialized_start=2866
|
83
|
+
_globals['_GETGCSURLRESPONSE']._serialized_end=2921
|
84
|
+
_globals['_BATCHGETGCSURLRESPONSE']._serialized_start=2923
|
85
|
+
_globals['_BATCHGETGCSURLRESPONSE']._serialized_end=2983
|
86
|
+
_globals['_GCSURLINFO']._serialized_start=2985
|
87
|
+
_globals['_GCSURLINFO']._serialized_end=3080
|
88
|
+
_globals['_EMPTY']._serialized_start=3082
|
89
|
+
_globals['_EMPTY']._serialized_end=3089
|
90
|
+
_globals['_FILESERVICE']._serialized_start=3092
|
91
|
+
_globals['_FILESERVICE']._serialized_end=4034
|
92
|
+
# @@protoc_insertion_point(module_scope)
|
@@ -61,6 +61,7 @@ message UploadFileRequest {
|
|
61
61
|
string mime_type = 5;
|
62
62
|
optional bool is_temporary = 6;
|
63
63
|
optional int32 expire_seconds = 7;
|
64
|
+
optional bool keep_original_filename = 8; // 保留原始文件名,默认false
|
64
65
|
}
|
65
66
|
|
66
67
|
message UploadUrlRequest {
|
@@ -72,6 +73,7 @@ message UploadUrlRequest {
|
|
72
73
|
string file_hash = 6;
|
73
74
|
optional bool is_temporary = 7;
|
74
75
|
optional int32 expire_seconds = 8;
|
76
|
+
optional bool keep_original_filename = 9; // 保留原始文件名,默认false
|
75
77
|
}
|
76
78
|
|
77
79
|
message UploadCompletedRequest {
|
@@ -179,6 +181,7 @@ message DownloadUrlInfo {
|
|
179
181
|
|
180
182
|
message GetGcsUrlResponse {
|
181
183
|
string gcs_url = 1;
|
184
|
+
string mime_type = 2;
|
182
185
|
}
|
183
186
|
|
184
187
|
message BatchGetGcsUrlResponse {
|
@@ -188,7 +191,8 @@ message BatchGetGcsUrlResponse {
|
|
188
191
|
message GcsUrlInfo {
|
189
192
|
string file_id = 1;
|
190
193
|
string gcs_url = 2;
|
191
|
-
|
194
|
+
string mime_type = 3;
|
195
|
+
optional string error = 4;
|
192
196
|
}
|
193
197
|
|
194
198
|
message Empty {}
|
{tamar_file_hub_client-0.1.1 → tamar_file_hub_client-0.1.3}/file_hub_client/schemas/__init__.py
RENAMED
@@ -14,6 +14,7 @@ from .file import (
|
|
14
14
|
DownloadUrlInfo,
|
15
15
|
BatchDownloadUrlResponse,
|
16
16
|
GcsUrlInfo,
|
17
|
+
GetGcsUrlResponse,
|
17
18
|
BatchGcsUrlResponse,
|
18
19
|
)
|
19
20
|
from .folder import (
|
@@ -70,6 +71,7 @@ __all__ = [
|
|
70
71
|
"DownloadUrlInfo",
|
71
72
|
"BatchDownloadUrlResponse",
|
72
73
|
"GcsUrlInfo",
|
74
|
+
"GetGcsUrlResponse",
|
73
75
|
"BatchGcsUrlResponse",
|
74
76
|
|
75
77
|
# 文件夹相关
|
@@ -111,9 +111,16 @@ class GcsUrlInfo(BaseModel):
|
|
111
111
|
"""GCS URL信息"""
|
112
112
|
file_id: str = Field(..., description="文件ID")
|
113
113
|
gcs_url: str = Field(..., description="GCS URL")
|
114
|
+
mime_type: str = Field(..., description="MIME类型")
|
114
115
|
error: Optional[str] = Field(None, description="错误信息")
|
115
116
|
|
116
117
|
|
118
|
+
class GetGcsUrlResponse(BaseModel):
|
119
|
+
"""获取GCS URL响应"""
|
120
|
+
gcs_url: str = Field(..., description="GCS URL")
|
121
|
+
mime_type: str = Field(..., description="MIME类型")
|
122
|
+
|
123
|
+
|
117
124
|
class BatchGcsUrlResponse(BaseModel):
|
118
125
|
"""批量GCS URL响应"""
|
119
126
|
gcs_urls: List[GcsUrlInfo] = Field(default_factory=list, description="GCS URL列表")
|