作者:孫嘉成
目錄
一、對象存儲
二、FastAPI與對象存儲
2.1 繽紛云S4服務API對接與鑒權實現
2.2 RESTful接口設計與異步路由優化
三、Flutter界面與數據交互開發
3.1 應用的創建
3.2頁面的搭建
3.3 文件的上傳
關鍵詞:對象存儲、FastAPI、Flutter
一、對象存儲
對象存儲服務(Object Storage Service,OSS)是一種以離散數據單元為操作對象的技術架構,依托分布式系統架構提供基于對象形式的數據存儲服務。相較于傳統數據庫,對象存儲在存儲海量非結構化數據時具有顯著優勢,通過橫向擴展架構實現近乎無限的存儲容量;采用多副本/糾刪碼技術保障數據持久性;支持高并發訪問確保讀寫性能;通過智能數據冗余機制提升存儲效率。
當前主流云服務提供商均推出了自研的對象存儲服務,典型代表包括阿里云OSS、騰訊云COS、華為云OBS以及繽紛云S4存儲等產品。
繽紛云 S4 對象存儲服務作為新一代云原生存儲平臺,深度融合了分布式存儲技術和智能管理算法,為企業級用戶提供安全可靠、彈性擴展的非結構化數據存儲解決方案。下面介紹如何使用:
首先進入官網:
點擊控制臺進行注冊和登錄操作:
在桶列表中創建一個桶進行數據的存儲:
添加子賬戶并獲取桶的管理權限:
打開創建子用戶的讀寫權限:
二、FastAPI與對象存儲
2.1 繽紛云S4服務API對接與鑒權實現
查看官方文檔,查看如何通過Python實現對繽紛云S4的操作。
引入 boto3 框架,在命令行中使用命令pip install boto3下載。
根據官方文檔進行配置:
將其中的信息更換為自己的信息即可,打印的信息中“HTTPStatusCode”對應的值為200,即代表配置成功。
2.2 RESTful接口設計與異步路由優化
下載FastAPI框架:
創建POST接口,接收文件:
設置應用啟動端口:
運行應用進行測試:
點擊后在瀏覽器地址欄輸入/docs進入FastAPI框架自帶的文檔進行上傳文件測試:
選擇文件進行上傳:
返回成功信息:
三、Flutter界面與數據交互開發
3.1 應用的創建
打開命令窗口,創建Flutter應用
根據命令提示,構建項目
3.2頁面的搭建
居中按鈕組件
Center(child: _buildUploadButton(context: context,label: '圖片上傳',onPressed: invoiceUploadViewModel.uploadInvoice,isActive: !invoiceUploadViewModel.isUploading,),),
上傳邏輯
Future<void> uploadInvoice() async {try {if (_isUploading) return;_isUploading = true;notifyListeners();final files = await _invoiceUploadRepository.pickFiles();if (files == null || files.isEmpty) {_isUploading = false;notifyListeners();return;}final prefs = await SharedPreferences.getInstance();final userInfo = jsonDecode(prefs.getString('userInfo')!);final userId = userInfo['user_id'] as int; // 明確類型轉換final tempMessages = <String>[];for (final file in files) {try {final imageUrl = await _invoiceUploadRepository.uploadToOSS(file,userId,);final result = await _invoiceUploadRepository.submitInvoiceInfo(imageUrl,userId,);tempMessages.add('? ${path.basename(file.path)} 上傳成功: $result');successCount++;} catch (e) {debugPrint(_getErrorMessage(e));tempMessages.add('? ${path.basename(file.path)} 上傳失敗: 發票已存在',); // 顯示具體錯誤}notifyListeners();}_messages.addAll(tempMessages);_isUploaded = true;_messages.add('🚨 系統錯誤: ${_getErrorMessage(e)}');} catch (e) {} finally {_isUploading = false;notifyListeners();}}
3.3 文件的上傳
Future<String> uploadToOSS(File file, int userId) async {final fileName = path.basename(file.path); // 使用 path 包獲取正確文件名await uploadImage(file, userId);return 'https://fapiao.s3.bitiful.net/images/$userId/$fileName'; // 修正路徑拼接}
文件成功上傳: