qiniu_upload_manager/
upload_manager.rs

1use super::{
2    upload_token::UploadTokenSigner, AutoUploader, AutoUploaderBuilder, FormUploader, MultiPartsUploader,
3    MultiPartsV1Uploader, MultiPartsV2Uploader, ResumableRecorder, SinglePartUploader,
4};
5use assert_impl::assert_impl;
6use digest::Digest;
7use qiniu_apis::{
8    http_client::{BucketRegionsQueryer, BucketRegionsQueryerBuilder, Endpoints, HttpClient},
9    Client as QiniuApiClient,
10};
11use std::sync::Arc;
12
13/// 上传管理器
14#[derive(Debug, Clone)]
15pub struct UploadManager(Arc<UploadManagerInner>);
16
17#[derive(Debug)]
18struct UploadManagerInner {
19    upload_token_signer: UploadTokenSigner,
20    client: QiniuApiClient,
21    queryer: BucketRegionsQueryer,
22}
23
24impl UploadManager {
25    /// 创建上传管理构建器
26    #[inline]
27    pub fn builder(upload_token: impl Into<UploadTokenSigner>) -> UploadManagerBuilder {
28        UploadManagerBuilder::new(upload_token)
29    }
30
31    /// 创建上传管理器
32    #[inline]
33    pub fn new(upload_token: impl Into<UploadTokenSigner>) -> Self {
34        Self::builder(upload_token).build()
35    }
36
37    /// 获取上传凭证签发器
38    #[inline]
39    pub fn upload_token(&self) -> &UploadTokenSigner {
40        &self.0.upload_token_signer
41    }
42
43    /// 获取七牛 API 调用客户端
44    #[inline]
45    pub fn client(&self) -> &QiniuApiClient {
46        &self.0.client
47    }
48
49    /// 获取存储空间相关区域查询器
50    #[inline]
51    pub fn queryer(&self) -> &BucketRegionsQueryer {
52        &self.0.queryer
53    }
54
55    /// 创建默认的单请求上传器
56    #[inline]
57    pub fn single_part_uploader(&self) -> impl SinglePartUploader {
58        self.form_uploader()
59    }
60
61    /// 创建表单上传器
62    #[inline]
63    pub fn form_uploader(&self) -> FormUploader {
64        FormUploader::new(self.to_owned())
65    }
66
67    /// 创建默认的分片上传器
68    #[inline]
69    pub fn multi_parts_uploader<H: Digest + Send + 'static, R: ResumableRecorder<HashAlgorithm = H> + 'static>(
70        &self,
71        resumable_recorder: R,
72    ) -> impl MultiPartsUploader<HashAlgorithm = H> {
73        self.multi_parts_v2_uploader(resumable_recorder)
74    }
75
76    /// 创建分片上传器 V1
77    #[inline]
78    pub fn multi_parts_v1_uploader<H: Digest + Send + 'static, R: ResumableRecorder<HashAlgorithm = H> + 'static>(
79        &self,
80        resumable_recorder: R,
81    ) -> MultiPartsV1Uploader<H> {
82        MultiPartsV1Uploader::<H>::new(self.to_owned(), resumable_recorder)
83    }
84
85    /// 创建分片上传器 V2
86    #[inline]
87    pub fn multi_parts_v2_uploader<H: Digest + Send + 'static, R: ResumableRecorder<HashAlgorithm = H> + 'static>(
88        &self,
89        resumable_recorder: R,
90    ) -> MultiPartsV2Uploader<H> {
91        MultiPartsV2Uploader::<H>::new(self.to_owned(), resumable_recorder)
92    }
93
94    /// 创建自动上传器
95    #[inline]
96    pub fn auto_uploader<H: Digest + Send + 'static>(&self) -> AutoUploader<H> {
97        AutoUploader::<H>::new(self.to_owned())
98    }
99
100    /// 创建自动上传构建器
101    #[inline]
102    pub fn auto_uploader_builder<H: Digest + Send + 'static>(&self) -> AutoUploaderBuilder<H> {
103        AutoUploader::<H>::builder(self.to_owned())
104    }
105
106    #[allow(dead_code)]
107    fn assert() {
108        assert_impl!(Send: Self);
109        assert_impl!(Sync: Self);
110    }
111}
112
113/// 上传管理构建器
114#[derive(Debug)]
115pub struct UploadManagerBuilder {
116    api_client: Option<QiniuApiClient>,
117    http_client: Option<HttpClient>,
118    queryer_builder: Option<BucketRegionsQueryerBuilder>,
119    queryer: Option<BucketRegionsQueryer>,
120    upload_token_signer: UploadTokenSigner,
121}
122
123impl UploadManagerBuilder {
124    /// 创建上传管理构建器
125    #[inline]
126    pub fn new(upload_token_signer: impl Into<UploadTokenSigner>) -> Self {
127        Self {
128            upload_token_signer: upload_token_signer.into(),
129            api_client: Default::default(),
130            http_client: Default::default(),
131            queryer_builder: Default::default(),
132            queryer: Default::default(),
133        }
134    }
135
136    /// 设置七牛 API 调用客户端
137    #[inline]
138    pub fn api_client(&mut self, api_client: QiniuApiClient) -> &mut Self {
139        self.api_client = Some(api_client);
140        self
141    }
142
143    /// 设置 HTTP 客户端
144    pub fn http_client(&mut self, http_client: HttpClient) -> &mut Self {
145        self.http_client = Some(http_client.to_owned());
146        self.with_queryer_builder(|queryer_builder| {
147            queryer_builder.http_client(http_client);
148        })
149    }
150
151    /// 是否启用 HTTPS 协议
152    ///
153    /// 默认为 HTTPS 协议
154    pub fn use_https(&mut self, use_https: bool) -> &mut Self {
155        self.http_client(HttpClient::build_default().use_https(use_https).build())
156            .with_queryer_builder(|queryer_builder| {
157                queryer_builder.use_https(use_https);
158            })
159    }
160
161    /// 设置存储空间相关区域查询器
162    #[inline]
163    pub fn queryer(&mut self, queryer: BucketRegionsQueryer) -> &mut Self {
164        self.queryer = Some(queryer);
165        self
166    }
167
168    /// 设置存储空间管理终端地址
169    pub fn uc_endpoints(&mut self, endpoints: impl Into<Endpoints>) -> &mut Self {
170        self.with_queryer_builder(|queryer_builder| {
171            queryer_builder.uc_endpoints(endpoints);
172        })
173    }
174
175    fn with_queryer_builder(&mut self, f: impl FnOnce(&mut BucketRegionsQueryerBuilder)) -> &mut Self {
176        if let Some(queryer_builder) = self.queryer_builder.as_mut() {
177            f(queryer_builder);
178        } else {
179            let mut queryer_builder = BucketRegionsQueryer::builder();
180            f(&mut queryer_builder);
181            self.queryer_builder = Some(queryer_builder);
182        }
183        self
184    }
185
186    /// 构建上传管理器
187    pub fn build(&mut self) -> UploadManager {
188        let upload_token_provider = self.upload_token_signer.to_owned();
189        let api_client = self.api_client.take();
190        let http_client = self.http_client.take();
191        let queryer = self.queryer.take();
192        let mut queryer_builder = self.queryer_builder.take();
193        UploadManager(Arc::new(UploadManagerInner {
194            upload_token_signer: upload_token_provider,
195            client: api_client
196                .or_else(|| http_client.map(QiniuApiClient::new))
197                .unwrap_or_default(),
198            queryer: queryer
199                .or_else(|| queryer_builder.as_mut().map(|builder| builder.build()))
200                .unwrap_or_default(),
201        }))
202    }
203
204    #[allow(dead_code)]
205    fn assert() {
206        assert_impl!(Send: Self);
207        assert_impl!(Sync: Self);
208    }
209}