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.mzph.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. 首先、假设输入数据是符合正态分布…