minio+tusd+uppy搭建文件上传服务

news2024/12/31 5:49:34

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-57Z
    container_name: minio-server
    restart: always
    hostname: minio
    ports:
    # API服务端口
      - 9100:9000
    # 管理系统端口
      - 9101:9001
    environment:
      # 管理系统用户名
      MINIO_ROOT_USER: admin
      # 管理系统密码
      MINIO_ROOT_PASSWORD: admin123
    volumes:
      - ./data:/data
      - ./config:/root/.minio/
    command: minio server --console-address ':9001'  /data
    privileged: true
    networks:
      - file-server

  tus-server:
    image: tusproject/tusd:2.0.0.rc21
    container_name: tus-server
    ports:
      - 9102:1080
    environment:
      # minio凭证,可以在minio管理系统生成key
      AWS_ACCESS_KEY_ID: admin
      AWS_SECRET_ACCESS_KEY: admin123
      AWS_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 -verbose
    privileged: true
    networks:
      - file-server

networks:
  file-server:
    driver: bridge
    ipam:
      config:
        - subnet: 155.119.0.0/16
          gateway: 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 * 1024

let uppy: Uppy

onMounted(() => {
  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 token
        const token = localStorage.getItem('test-token') as string
        req.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.coloradmin.cn/o/1861471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工业软件的分类与选择策略:针对中小企业的实际应用考量

工业软件是现代工业体系的“大脑”&#xff0c;已经渗透到几乎所有工业领域的核心环节&#xff0c;是现代产业之“魂”&#xff0c;是制造强国之重器。工业软件通过优化生产流程、实时监控设备状态、实现自动化控制等功能&#xff0c;可以帮助企业显著提升生产效率和质量&#…

python爬虫-爬虫的基础知识储备

爬虫就是一个不断的去抓去网页的程序&#xff0c;根据我们的需要得到我们想要的结果&#xff01;但我们又要让服务器感觉是我们人在通过浏览器浏览不是程序所为&#xff01;归根到底就是我们通过程序访问网站得到html代码&#xff0c;然后分析html代码获取有效内容的过程。下面…

透明屏幕的魅力:为何它如此受欢迎

在科技日新月异的今天&#xff0c;透明屏幕技术以其独特的魅力和广泛的应用前景&#xff0c;逐渐成为了科技领域的一颗璀璨明星。从智能手机、平板电脑到大型显示屏&#xff0c;透明屏幕技术以其前所未有的视觉体验和实用性&#xff0c;赢得了广大消费者的喜爱。 一、透明屏幕的…

苏宁易购通用卡怎么使用?

现在还有人用苏宁的礼品卡吗 前两天618&#xff0c;想买点家电&#xff0c;但是在苏宁上看价格还不如京东淘宝优惠 最后手里的苏宁卡也没用出去 本来想着要不送人算了&#xff0c;但是收卡云的价格也还不错&#xff0c;最后就卖出去了 500块钱的苏宁卡买了475&#xff0c;到…

麦汁充氧装置——文丘里管

嗨&#xff0c;亲爱的酿酒师们&#xff01;今天&#xff0c;小编要来给大家介绍一个在啤酒酿造中起关键作用的装置——文丘里管&#xff0c;诚挚地邀请各位朋友们&#xff0c;与天泰一起探讨文丘里管的工作原理以及其在精酿啤酒领域的应用。 大家都知道&#xff0c;酵母属于兼性…

DIY 智能门禁:用 ESP32 RFID 打造安全便捷的家居体验 (附代码)

一、系统概述 本项目旨在使用 ESP32 微控制器和 RFID 技术构建一个安全可靠的门禁系统。该系统利用 RFID 卡进行身份验证&#xff0c;通过读取卡内存储的唯一 ID&#xff0c;判断用户权限并控制门锁的开关。ESP32 强大的 Wi-Fi 功能还能实现远程监控和管理&#xff0c;方便用户…

系统漏洞复现与勒索病毒

知识点&#xff1a;SMB漏洞介绍、漏洞复现流程、勒索病毒攻击与防护 渗透测试相关&#xff1a; 基本概念&#xff1a; 渗透测试就是利用我们所掌握的渗透知识&#xff0c;对网站进行一步一步的渗透&#xff0c;发现其中存在的漏洞和隐藏的风险&#xff0c;然后撰写一篇测试报…

[经典]原型资源:蚂蚁金服UI模版部件库

部件库预览链接&#xff1a; https://d3ttsx.axshare.com 支持版本: Axrure RP 8 文件大小: 30MB 文档内容介绍 基本部件&#xff1a;表单样式&#xff1a;12款、数据样式&#xff1a;10款、服务样式&#xff1a;6款、导航&#xff1a;5款、业务组件&#xff1a;7款、 模板…

TMDS编码原理以及Verilog实现HDMI接口

文章目录 一、HDMI简介二、HDMI接口以及引脚定义三、HDMI传输原理四、TMDS编码规则以及实现4.1 TMDS编码框图4.2 TMDS编码流程图4.3 Verilog实现TMDS编码 五、OSERDESE2原语介绍以及使用5.1 OSERDESE2内部框图5.2 OSERDESE2 输入输出管脚信号说明5.3 OSERDESE2 配置属性信号说明…

如何写好AI绘画提示词?保姆级教程来了!

前言 提示词编辑是一个结构化的过程&#xff0c;用能被人类解释和理解的词语来描述图像&#xff0c;也就是告诉人工智能模型应该怎么绘制图片。 生成优质图像的秘诀 1.提示词要想编辑好&#xff0c;包括修饰词和好的句子结构&#xff0c;首先你要了解所有的修饰词类型。 2.St…

浅析Kubernetes的权限控制模型

Kubernetes是一个开源的容器编排引擎&#xff0c;用来对容器化应用进行自动化部署、扩缩和管理。它是一个强大的集群管理系统&#xff0c;提供了丰富的功能。他的一个核心组件是Kubernetes API Server&#xff0c;这是集群中所有资源管理的入口点&#xff0c;提供了一组RESTful…

【算能全国产AI盒子】基于BM1688CV186AH+FPGA智能物联工作站,支持差异化泛AI视觉产品定制

在数据呈现指数级增长的今天&#xff0c;越来越多的领域和细分场景对实时、高效的数据处理和分析的需求日益增长&#xff0c;对智能算力的需求也不断增强。为应对新的市场趋势&#xff0c;凭借自身的硬件研发优势&#xff0c;携手算能相继推出了基于BM1684的边缘计算盒子&#…

可视化大屏的C位:12种常见的情形,一文告诉你。

C位又称焦点图&#xff0c;是占据可视化大屏视觉焦点位置&#xff0c;一般位于屏幕最中间。本文先列举12个&#xff0c;供大家欣赏。 1.地球 2.世界地图 3.中国 4.行政区划 5.社区 6.园区 7.城市 8.场馆 9.建筑 10.工厂 11.设备 12.流程/组态

Excel 宏录制与VBA编程 —— 14、使用VBA处理Excel事件

简介 若希望特定事件处理程序在触发特定事件时运行&#xff0c;可以为 Application 对象编写事件处理程序。 Application 对象的事件处理程序是全局的&#xff0c;这意味着只要 Microsoft Excel 处于打开状态&#xff0c;事件处理程序将在发生相应的事件时运行&#xff0c;而不…

Spring Cloud Gateway3.x自定义Spring Cloud Loadbalancer负载均衡策略以及实现动态负载均衡策略的方案

目录 前言 1.原理分析 1.1 ReactiveLoadBalancerClientFilter源码分析 1.2 LoadBalancerClientFactory源码分析 2.代码实现 2.1 扩展原生RoundRobinLoadBalancer轮询策略 2.1.1 自定义实现RoundRobinLoadBalancer 2.1.2 配置自定义的RoundRobinLoadBalan…

【源码+文档+调试讲解】基于Java的推箱子游戏设计与实现

摘 要 社会在进步&#xff0c;人们生活质量也在日益提高。高强度的压力也接踵而来。社会中急需出现新的有效方式来缓解人们的压力。此次设计符合了社会需求&#xff0c;Java推箱子游戏可以让人们在闲暇之余&#xff0c;体验游戏的乐趣。具有操作简单,易于上手的特点。 推箱子…

Vulnhub靶场DC-4练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 爆破登录2. 命令执行3. 反弹shell4. hydra爆破ssh5. 提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-4.zip 介绍&#xff1a; DC-4 is another purposely built …

短视频矩阵系统搭建APP源码开发

前言 短视频矩阵系统不仅有助于提升品牌影响力和营销效率&#xff0c;还能帮助企业更精准地触达目标受众&#xff0c;增强用户互动&#xff0c;并利用数据分析来持续优化营销策略。 一、短视频矩阵系统是什么&#xff1f; 短视频矩阵系统是一种通过多个短视频平台进行内容创作…

汉语翻译藏语软件,这几款软件不妨一试!

在全球化日益加深的今天&#xff0c;语言障碍成为了许多人在文化交流、商务洽谈或旅游探险中不得不面对的问题。特别是对于汉语和藏语这两种语言来说&#xff0c;由于其独特的文化背景和语法结构&#xff0c;翻译起来更是难上加难。不过&#xff0c;好在科技的进步为我们带来了…

可变分区管理 分区分配算法

First Fit Algorithm Best Fit Algorithm FFA&#xff1a;按照起始地址从小到大&#xff08;本题为分区编号&#xff09;找到第一个能装下进程的起始地址填入第二个表 此时 原表中将起始地址进程大小 分区大小-进程大小 如此继续 BFA&#xff1a;按分区大小排序 从小到大 找到…