TypeScript前端上传文件到MinIO

简介: TypeScript前端上传文件到MinIO

什么是MinIO?

MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。

本地Docker部署测试服务器

docker pull bitnami/minio:latest
# MINIO_ROOT_USER最少3个字符# MINIO_ROOT_PASSWORD最少8个字符# 第一次运行的时候,服务会自动关闭,手动再次启动就可以正常运行了.docker run -itd \
--name minio-server \
-p9000:9000 \
-p9001:9001 \
--envMINIO_ROOT_USER="root" \
--envMINIO_ROOT_PASSWORD="123456789" \
--envMINIO_DEFAULT_BUCKETS='images' \
--envMINIO_FORCE_NEW_KEYS="yes" \
--envBITNAMI_DEBUG=true \
    bitnami/minio:latest

上传的API

它有3个API可供调用:

  1. putObject 从流上传
  2. fPutObject 从文件上传
  3. presignedPutObject 提供一个临时的上传链接以供上传

使用1和2的方式的话,在前端需要暴露出连接MinIO的访问密钥,很不安全,而且官方的Js客户端压根就没想过开放给浏览器.

而3的话,可以由服务端生成一个临时的上传链接提供给前端上传之用,而无需要暴露访问MinIO的密钥,非常的安全,我采用的是第三种方式.

第三种方式,官方有一篇文章: Upload Files Using Pre-signed URLs

TypeScript实现

在TypeScript下,我们可用的有三种方式实现文件上传:

  1. XMLHttpRequest
  2. Fetch API
  3. Axios

需要注意的是: 事实上,后两种API都是封装的XMLHttpRequest.

1. XMLHttpRequest

functionxhrUploadFile(file: File, url: string) {
constxhr=newXMLHttpRequest();
xhr.open('PUT', url, true);
xhr.send(file);
xhr.onload= () => {
if (xhr.status===200) {
console.log(`${file.name}上传成功`);
    } else {
console.error(`${file.name}上传失败`);
    }
  };
}

2. Fetch API

functionfetchUploadFile(file: File, url: string) {
fetch(url, {
method: 'PUT',
body: file,
  })
    .then((response) => {
console.log(`${file.name}上传成功`, response);
    })
    .catch((error) => {
console.error(`${file.name}上传失败`, error);
    });
}

3. Axios

functionaxiosUploadFile(file: File, url: string) {
constinstance=axios.create();
instance    .put(url, file, {
headers: {
'Content-Type': file.type,
      },
    })
    .then(function (response) {
console.log(`${file.name}上传成功`, response);
    })
    .catch(function (error) {
console.error(`${file.name}上传失败`, error);
    });
}

从后端获取临时上传链接

functionretrieveNewURL(file: File, cb: (file: File, url: string) =>void) {
consturl=`http://localhost:8080/presignedUrl/${file.name}`;
axios.get(url)
    .then(function (response) {
cb(file, response.data.data.url);
    })
    .catch(function (error) {
console.error(error);
    });
}

上传文件

functiononXhrUploadFile(file?: File) {
console.log('onXhrUploadFile', file);
if (file) {
retrieveNewURL(file, (file, url) => {
xhrUploadFile(file, url);
    });
  }
}

踩过的坑

1. presignedPutObject方式上传提交的方法必须得是PUT

我试过了用POST去上传文件,但是显然的是:我失败了.必须得用PUT去上传.

2. 直接发送File即可

看了不少文章都是这么干的: 构造一个FormData,然后把文件打进去,如果用putObjectfPutObject这两种方式上传,这是没问题的,但是使用presignedPutObject则是不行的,直接发送File就可以了.

fileUpload(file) {
consturl='http://example.com/file-upload';
constformData=newFormData();
formData.append('file', file)
constconfig= {
headers: {
'content-type': 'multipart/form-data'        }
    }
returnpost(url, formData,config)
}

如果使用以上的方式上传,文件头会被插入一段数据,看起来像是这样子的:

------WebKitFormBoundaryaym16ehT29q60rUx
Content-Disposition: form-data; name="file"; filename="webfonts.zip"
Content-Type: application/zip

它是遵照了 rfc1867 定义的协议.

3. 使用Axios上传的时候,需要自己把Content-Type填写成为file.type

直接使用XMLHttpRequestFetch API都会自动填写成为文件真实的Content-Type.而Axios则不会,需要自己填写进去,或许是我不会使用Axios,但是这是一个需要注意的地方,否则在MinIO里边的Content-Type会被填写成为Axios默认的Content-Type,或者是你自己指定的.

示例代码

Github: https://github.com/tx7do/minio-typescript-example

  • 后端采用go+gin实现,用于调用MinIO的APIpresignedPutObject获取临时上传Url.
  • 前端有React和Vue的实现,要实现进度条和多文件上传也是容易的.
目录
相关文章
|
2月前
|
JavaScript 前端开发 安全
Apollo与TypeScript:强大类型检查在前端开发中的应用
Apollo与TypeScript:强大类型检查在前端开发中的应用
|
1月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
|
8月前
|
缓存 JSON 前端开发
2023年最新前端面试题汇总大全二(含答案超详细,Vue,TypeScript,React,微信小程序,Webpack 汇总篇)-- 持续更新 7
2023年最新前端面试题汇总大全二(含答案超详细,Vue,TypeScript,React,微信小程序,Webpack 汇总篇)-- 持续更新
434 0
|
1月前
|
前端开发
前端input上传文件获取视频或音频的时长
前端input上传文件获取视频或音频的时长
90 0
|
1月前
|
前端开发 JavaScript 安全
使用React、TypeScript和Ant Design构建现代化前端应用
使用React、TypeScript和Ant Design构建现代化前端应用
22 0
|
2月前
|
自然语言处理 前端开发 JavaScript
TypeScript实战——ChatGPT前端自适应手机端,PC端
TypeScript实战——ChatGPT前端自适应手机端,PC端
|
3月前
|
JavaScript 前端开发 安全
【面试题】 TypeScript 前端面试题 由浅到深(二)
【面试题】 TypeScript 前端面试题 由浅到深(二)
|
3月前
|
JavaScript 前端开发 安全
【面试题】 TypeScript 前端面试题 由浅到深(一)
【面试题】 TypeScript 前端面试题 由浅到深(一)
|
4月前
|
JSON 前端开发 JavaScript
前端上传文件前检测文件数据🔍
前端上传文件前检测文件数据🔍
|
7月前
|
JavaScript 前端开发 编译器
前端经典面试题 | 吊打面试官系列 之 说说你对TypeScript 和 JavaScript的理解
前端经典面试题 | 吊打面试官系列 之 说说你对TypeScript 和 JavaScript的理解