minio+tusd+uppy搭建文件上傳服務

1、docker部署minio、tusd服務

1.1 新建docker-compose.yml

minio API: http://ip:9100
minio控制臺: http://ip:9101
tus API: http://ip:9102/files/
tus webhooh: http:172.0.0.1:3000/files/webhooh(用戶鑒權API)

version: '3.7'services:minio:image: minio/minio:RELEASE.2023-07-07T07-13-57Zcontainer_name: minio-serverrestart: alwayshostname: minioports:# API服務端口- 9100:9000# 管理系統端口- 9101:9001environment:# 管理系統用戶名MINIO_ROOT_USER: admin# 管理系統密碼MINIO_ROOT_PASSWORD: admin123volumes:- ./data:/data- ./config:/root/.minio/command: minio server --console-address ':9001'  /dataprivileged: truenetworks:- file-servertus-server:image: tusproject/tusd:2.0.0.rc21container_name: tus-serverports:- 9102:1080environment:# minio憑證,可以在minio管理系統生成keyAWS_ACCESS_KEY_ID: adminAWS_SECRET_ACCESS_KEY: admin123AWS_REGION: eu-west-1# 配置minio地址、jwt鑒權地址,轉發headers字段command: -s3-bucket file-oos -s3-endpoint http://minio:9000 -hooks-http http:172.0.0.1:3000/files/webhooh -hooks-http-forward-headers Authorization -hooks-http-retry 3 -verboseprivileged: truenetworks:- file-servernetworks:file-server:driver: bridgeipam:config:- subnet: 155.119.0.0/16gateway: 155.119.0.1
1.2 啟動服務

docker-compose up -d

2、編寫鑒權接口,簡單點的話就校驗jwt token

import { Controller, Post, Req} from '@nestjs/common';
import { ApiTags, ApiOperation } from '@nestjs/swagger';@ApiTags('文件管理')
@Controller('files')
export class AuthController {@ApiOperation({ summary: 'tus服務鑒權' })@Post('webhooh')webhooh(@Req() request: Request) {/*** tus服務提供的鉤子* pre-create: 上傳請求創建前* post-create: 創建上傳請求* post-receive: 接收數據* post-finish: 上傳結束,可以在這里更改文件名*/const body: any = request.body;if (body.Type === 'post-finish') {const uploadData = body.Event.Upload;// 文件名和類型const { filename, filetype } = uploadData.MetaData;// minio桶名const bucket = uploadData.Storage.Bucket}return '鑒權通過';}
}

3、vue使用uppy上傳文件(支持多文件、斷點續傳、秒傳等)

<!--  大文件上傳 -->
<template><div class="upload-container"><div id="uppy-dashboard"></div><!-- <div id="uppy-drag-drop"></div> --><!-- <div id="uppy-progress-bar"></div> --><!-- <div id="uppy-status-bar"></div> --></div>
</template><script setup lang="ts">
import { onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { locale } from './locale'
import Uppy from '@uppy/core'
// import DragDrop from '@uppy/drag-drop'
// import StatusBar from '@uppy/status-bar'
import Tus from '@uppy/tus'
import Dashboard from '@uppy/dashboard'
// import ProgressBar from '@uppy/progress-bar'//引入樣式
import '@uppy/core/dist/style.min.css'
import '@uppy/dashboard/dist/style.min.css'
import '@uppy/drag-drop/dist/style.min.css'
import '@uppy/progress-bar/dist/style.min.css'// 1mb大小
const ONE_MB = 1024 * 1024let uppy: UppyonMounted(() => {uppy = new Uppy({debug: true, // 允許拖拽autoProceed: false, // 是否自動上傳restrictions: {maxFileSize: 500 * ONE_MB, // 設置最大文件大小maxNumberOfFiles: 5, // 設置最大上傳文件數量allowedFileTypes: ['.jpg', '.jpeg', '.png', '.zip', '.webm'], // 設置允許的文件類型},}).use(Dashboard, {inline: true,target: '#uppy-dashboard',locale,waitForThumbnailsBeforeUpload: true, // 等待上傳之前的縮略圖showProgressDetails: true, // false: 百分比;true:百分比 + 剩余時間// note: '文件上傳', // 底部文案proudlyDisplayPoweredByUppy: false, // 隱藏底部的uppy文案})// .use(ProgressBar, { target: '#uppy-progress-bar' })// .use(DragDrop, { target: '#uppy-drag-drop', note: '拖放或點擊' }) // 啟用拖動// .use(StatusBar, { target: '#uppy-status-bar' }) //啟用進度條.use(Tus, {endpoint: 'http://127.0.0.1:9102/files/', // 設置上傳文件的API接口limit: 5, // 限制同時進行的上傳數量,默認值20,不要沒有限制或者過大chunkSize: 500 * ONE_MB, // 設置分片的大小allowedMetaFields: ['name', 'type'], // 上傳所有元數據async onBeforeRequest(req, file) {console.log(file)// 添加jwt tokenconst token = localStorage.getItem('test-token') as stringreq.setHeader('Authorization', token)},})uppy.on('files-added', (result: any) => {console.log('文件批量添加完成', result)})// 監聽文件上傳uppy.on('complete', (result: any) => {// result是一個對象,屬性是:// 會返回failed(Array),因為可以多文件上傳會返回一個數組// successful(Array),因為可以多文件上傳會返回一個數組,包含文件上傳成功的信息console.log('上傳完成:', result)if (Array.isArray(result.failed) && result.failed.length > 0) {ElMessage.error(`文件上傳失敗,${result.failed}`)} else {ElMessage.success(`文件上傳成功`)}})
})
</script>

在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35116.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35116.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35116.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

亞馬遜運營專詞(一)

許多新入駐亞馬遜的大陸賣家&#xff0c;對亞馬遜的專業詞匯還不太了解&#xff0c;導致在運營店鋪的過程出現一些問題&#xff0c;今天就來講解一下亞馬遜常用的運營專詞&#xff0c;方便新手賣家深入了解。 1. Listing&#xff1a;亞馬遜listing指的是產品的詳情頁面&#xf…

通過BLE實現類似UART的串行通信:NUS服務 vs GATT服務

在物聯網和智能設備的發展中&#xff0c;藍牙低功耗&#xff08;Bluetooth Low Energy, BLE&#xff09;技術已經成為無線數據傳輸的重要手段。本文將介紹通過BLE實現類似UART的串行通信&#xff0c;并對比NUS服務和GATT服務的使用場景&#xff0c;幫助開發者更好地選擇適合的技…

2024越南醫藥、制藥機械展

2024年越南國際醫藥&#xff0c;制藥裝備及技術展覽會 時間&#xff1a; 2024年11月21--23日 地點&#xff1a;越南胡志明市-西貢會展中心SECC 2024年越南國際醫藥&#xff0c;制藥裝備及技術展覽會將于2024年11月21-23日在越南胡志明市盛大舉行&#xff01;展覽會以國際化、專…

【Feature Pyramid Networks for Object Detection】

Feature Pyramid Networks for Object Detection 摘要引言2 相關工作3 FPN4 應用摘要 特征金字塔是識別系統中用于檢測不同尺度對象的基本組件。但是,最近的深度學習對象檢測器已經避免了金字塔表示,部分原因是它們在計算和內存方面都很密集。在這篇論文中,我們利用深度卷積…

LeetCode經典題之876、143 題解及延伸

系列目錄 88.合并兩個有序數組 52.螺旋數組 567.字符串的排列 643.子數組最大平均數 150.逆波蘭表達式 61.旋轉鏈表 160.相交鏈表 83.刪除排序鏈表中的重復元素 389.找不同 1491.去掉最低工資和最高工資后的工資平均值 896.單調序列 206.反轉鏈表 92.反轉鏈表II 141.環形鏈表 …

paddleocr查看標注好的數據錯誤信息

字符計數 import os import json from collections import Counter# 按字符計數 label_dir"/Users/thy/Downloads/chinese20240613" zi_ls[] with open(os.path.join(label_dir,"Label.txt")) as f:linesf.readlines()for line in lines:line line.strip…

Java面試題:聚簇索引和非聚簇索引

聚簇索引和非聚簇索引 聚簇索引(聚集索引) 將數據的存儲和索引放在一塊,索引結構的葉子節點保存了行數據 索引字段必須存在,且只能存在一個 非聚集索引(二級索引) 將數據和索引分開存儲,索引結構的葉子節點關聯的是對應的主鍵 索引字段可以存在多個 索引的選取規則 如果…

【學習】常用的分類網絡

1. LeNet 提出時間&#xff1a;1998年最新版本&#xff1a;原始版本使用的數據集格式&#xff1a;MNIST&#xff08;28x28灰度圖像&#xff09;優點&#xff1a; 結構簡單&#xff0c;易于理解和實現。對于小規模圖像數據集&#xff08;如MNIST&#xff09;有很好的表現。缺點…

豆瓣高分項目管理書籍推薦

&#x1f4ec;豆瓣網站上有很多項目管理領域的書籍獲得了較高的評分&#xff0c;以下是一些高分項目管理書籍的精選列表&#xff0c;發出來跟大家分享一下&#xff1a; 《項目管理知識體系指南&#xff08;PMBOK指南&#xff09;》 【內容簡介】這本書是美國項目管理協會&…

opencv檢測圖片上七種顏色,分辨顏色和對應位置

opencv檢測圖片上七種顏色&#xff0c;分辨顏色和對應位置 讀取圖片&#xff1a;使用cv2.imread()函數讀取目標圖片。 轉換顏色空間&#xff1a;通常在HSV顏色空間中進行顏色檢測&#xff0c;因為HSV顏色空間更適合描述顏色的屬性。 定義顏色范圍&#xff1a;為七種顏色定義…

RabbitMQ 修改默認密碼

RabbitMQ的一些常用命令 #啟動rabbitmq service rabbitmq-server start# 查看rabbitMQ的運行狀態 service rabbitmq-server status# 開啟rabbitMQ的后臺管理插件 rabbitmq-plugins enable rabbitmq_management # 重啟RabbitMQ服務 service rabbitmq-server restart RabbitMQ的…

AcWing 797:差分 ← 一維差分模板題

【題目來源】https://www.acwing.com/problem/content/799/【題目描述】 輸入一個長度為 n 的整數序列。 接下來輸入 m 個操作&#xff0c;每個操作包含三個整數 l,r,c&#xff0c;表示將序列中 [l,r] 之間的每個數加上 c。 請你輸出進行完所有操作后的序列。【輸入格式】 第一…

富格林:正規操作實現穩健出金

富格林認為&#xff0c;當下的金融市場&#xff0c;投資者進行理財都會特別關注盈利效率高的產品&#xff0c;而近年來興起的現貨黃金&#xff0c;其高效的盈利效率吸引著大批朋友關注。不過&#xff0c;要想在這盈利出金&#xff0c;就得學習掌握正規的交易策略。下面富格林將…

onnx模型修改:去掉Dropout層

文章目錄 嘗試1&#xff1a;強行設置dropout層train mode為False嘗試2&#xff1a;找到onnx模型中的dropout, train mode設置為False嘗試3&#xff1a;直接刪除dropout層&#xff0c;連接其輸入輸出結語 最近訓練模型使用了tinyvit&#xff0c;性能挺強的&#xff1a; 但是導出…

超細毛搭配超寬設計,一款更呵護牙齦的牙刷

牙齦敏感的時候&#xff0c;刷牙特別難受&#xff0c;最近試了試惠百施&#xff08;EBISU&#xff09;65孔寬頭軟毛牙刷&#xff0c;感覺它的口腔護理體驗很不錯。這款牙刷的設計獨特&#xff0c;采用寬頭設計&#xff0c;一次就能刷兩排牙齒&#xff0c;極大地提高了清潔效率。…

RS232自由轉Profinet協議網關模塊連接1200PLC與掃碼槍通訊及手動清零案例

一、RS232和Profinet這兩種通訊接口的特點和應用場景&#xff1a; RS232是一種串行通訊接口標準&#xff0c;常用于連接計算機和外部設備&#xff0c;傳輸速率較低但穩定可靠。Profinet則是一種工業以太網通訊協議&#xff0c;具有高速、實時性強的特點&#xff0c;適用于工業…

C/C++語言通過動態鏈表實現按需內存分配和使用(Linux Ubuntu 24.04環境)

我認為比較理想的內存使用方式應該實現這幾個特性&#xff1a; 1. 分配一塊能滿足大多數情況下需求的內存&#xff0c;比如80%的情況下都不需要再次分配內存。 2. 對另外20%需要較多內存的情況&#xff0c;可以通過動態鏈表按需追加新的內存塊。 3. 要對總共消耗的內存有一個…

【C語言】解決C語言報錯:Dangling Pointer

文章目錄 簡介什么是Dangling PointerDangling Pointer的常見原因如何檢測和調試Dangling Pointer解決Dangling Pointer的最佳實踐詳細實例解析示例1&#xff1a;釋放內存后未將指針置為NULL示例2&#xff1a;返回指向局部變量的指針示例3&#xff1a;指針懸空后繼續使用示例4&…

引領未來:AI Native與物聯網(IoT)的革命性融合

引領未來&#xff1a;AI Native與物聯網(IoT)的革命性融合 在數字化轉型的浪潮中&#xff0c;AI Native作為一種新興的軟件開發模式&#xff0c;正逐漸成為推動技術創新的核心力量。與此同時&#xff0c;物聯網(IoT)技術通過連接物理世界與數字世界&#xff0c;不斷擴展其應用…

自編碼器筆記

編碼器解碼器自編碼器 先壓縮特征&#xff0c;再通過特征還原。 判斷還原的和原來的是否相等 encode data 在一個“潛在空間”里。它的用途是“深度學習”的核心-學習數據的特征并簡化數據表示形式以尋找模式。 變分自編碼器&#xff1a; 1. 首先、假設輸入數據是符合正態分布…