Vue3快速实现文件上传OSS的方法详解

 更新时间:2024年01月28日 10:02:58   作者:吃她喵的花椒  
这篇文章给大家介绍了Vue3快速实现文件上传OSS的方法,上传文件可以说是经典的需求了,在后台管理项目中随处可见,一般是由前端进行文件上传,然后再由后端去处理,本文旨在实现上传功能,不考虑额外的功能(如文件尺寸限制),感兴趣的朋友可以参考下

前言

上传文件可以说是经典的需求了,在后台管理项目中随处可见。一般是由前端进行文件上传,然后再由后端去处理。可以选择把文件放到服务器上,但是随着后续文件增多,可能会对服务器的开销比较大,所以一般都采用OSS(Object Storage Service)对象存储服务,将我们的文件上传到第三方服务上,而我们只需要通过url去访问文件就可以了。那么今天就让我们来简单实现一下文件上传的功能吧。

前端采用的是Element plus的upload组件,后端是NodeJS,采用阿里云的OSS服务进行存储。

本文旨在实现上传功能,不考虑额外的功能(如文件尺寸限制)。

前端

前端引用一下组件,需要注意的是Element plus的upload组件提供了action配置项,填写请求URL就可以上传文件。

但为了后期维护,我们一般都不采用action配置项,而是将其赋值为#,通过http-request封装我们自己的请求方法。

通过组件库文档可知,我们的doUpload方法会获得一个options参数,我们来看看这个参数里有什么。

可以看到通过options可以获取到组件的一些属性和方法,其中的file就是我们所需要上传的文件对象。将其解构出来通过FormData创建表单对象将文件通过我们封装的upload方法传输到后端。

const doUpload = async (options: any) => {
  const { file } = options;
  const formData = new FormData();
  formData.append('file', file);
  await upload(fileData);
}

这里有个要点,因为是FormData表单对象,所以我们需要在请求头中设置Content-Typeapplication/form-data,这样后端才可以识别我们上传的文件,upload方法如下。

const headers = {
  'Content-type': 'application/form-data'
};
export function upload(params: any) {
  return instance.post('/uploadImg', params, { headers });
}

后端

后端我们采用express进行编写。

首先简单实现以下接口(注:由于我采用的是TypeScript,所以可以使用ESModule即import和export进行模块引入导出)。

import express from 'express';
const app = express();

app.post('/uploadImg',(req, res) => {});

app.listen(1300, () => {})

由于我们使用post请求,所以需要通过body-parser中间件对请求体的数据进行解析,使解析后的数据可用于后续的请求处理。

通过pnpm add body-parser 进行安装。

import bodyParser from 'body-parser';
app.use(bodyParser.json({ limit: '10mb' }));
app.use(bodyParser.urlencoded({ limit: '10mb', extended: true }));

以及还需要cors中间件解决跨域问题。

pnpm add cors

import cors from 'cors';
app.use(cors());

最后,我们还需要multer中间件处理我们上传的文件,具体使用如下。

pnpm add multer

import multer from 'multer';
const upload = multer({ dest: 'uploads/' }); // 指明文件的地址,即我们后端服务的uploads文件夹下,如果没有会创建。

// 接口中进行文件解析
app.post('/uploadImg', upload.single('file'), async (req: any, res: Response) => {})

这里的upload.single表明只处理上传数据中的file字段对应的数据,也就是我们之前formData.append('file',file)里的file文件,如果你设置的是其他字段如fileData,那么中间件就要写为upload.single('fileData')

我们可以通过req.file来获取处理好的文件,那么我们来看看打印一下这个req.file里有什么吧。

可以看到里面包含了关于文件的一些信息,比如名称、类型、地址等,其中名称和地址会是我们所需要的参数。

OSS服务

在阿里云的OSS文档里有提供文件上传的示例代码。

进入后我们选择NodeJS的SDK参考,通过下图路径可以看到本文所需的示例代码。

可以看到要使用OSS服务需要下载ali-oss第三方库。

pnpm add ali-oss

import * as OSS from 'ali-oss';

const client = new OSS.default({
  // yourRegion填写Bucket所在地域。以华东1(杭州)为例,Regin填写为oss-cn-hangzhou。
  region: 'oss-cn-hangzhou',
  accessKeyId: '你的阿里云key',
  accessKeySecret: '你的阿里云keyScerect',
  // 填写Bucket名称,例如examplebucket。
  bucket: '你阿里云OSS的桶名'
});

export async function put(filename: string, fileData: File) {
  try {
    // 填写OSS文件完整路径和本地文件的完整路径。OSS文件完整路径中不能包含Bucket名称。
    // 如果本地文件的完整路径中未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
    const result = await client.put(filename, fileData);
    return result;
  } catch (e) {
    console.log(e);
  }
}

以上就是完整的上传方法,只需要填写配置就行,其中accessKeyIdaccessKeySecret可以通过个人面板的AccessKey管理创建获取。

随后我们就可以在接口中进行调用,传入所需的filenamefileData

router.post('/uploadImg', upload.single('file'), async (req: any, res: Response) => {
  const file = req.file;
  const result = await put(file.originalname, file.path);
  res.send({ code: 200, data: { fileName: result?.name, url: result?.url } });
});

到现在为止,我们代码基本实现了,接下来看看成果吧。

可以在阿里云的OSS中看到我们上传的文件。

而在后端也可获取到接口返回的文件名和外链地址。

总结

以上就是通过Element Plus的Upload组件、NodeJS和阿里OSS服务实现的文件上传简单实现啦。我是花椒,如果你觉得我的文章还不错就给我点个赞吧~ 如果有什么错误也欢迎评论指正哦~

到此这篇关于Vue3快速实现文件上传OSS的方法详解的文章就介绍到这了,更多相关Vue3实现文件上传OSS内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue+Vux实现登录功能

    Vue+Vux实现登录功能

    这篇文章主要介绍了Vue+Vux实现登录功能,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • vue中过滤器的用法

    vue中过滤器的用法

    这篇文章介绍了vue中过滤器的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 代号为Naruto的Vue 2.7正式发布功能详解

    代号为Naruto的Vue 2.7正式发布功能详解

    这篇文章主要为大家介绍了代号为Naruto的Vue 2.7正式发布功能详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • vue实现短信验证码登录功能(流程详解)

    vue实现短信验证码登录功能(流程详解)

    无论是移动端还是pc端登录或者注册界面都会见到手机验证码登录这个功能,输入手机号,得到验证码,这篇文章主要介绍了基于vue实现短信验证码登录功能,需要的朋友可以参考下
    2019-12-12
  • Vue3中的Fragment使用方法详解

    Vue3中的Fragment使用方法详解

    Fragment 是 Vue 3 中的新特性,允许一个组件模板返回多个根节点,与传统方式不同,不再需要一个额外的 DOM 元素来包裹所有内容,本文将详细介绍 Fragment 的概念、使用场景、优点以及可能遇到的问题,需要的朋友可以参考下
    2024-08-08
  • Vue3动态使用KeepAlive组件的实现步骤

    Vue3动态使用KeepAlive组件的实现步骤

    在 Vue 3 项目中,我们有时需要根据路由的 meta 信息来动态决定是否使用 KeepAlive 组件,以控制组件的缓存行为,所以本文给大家介绍了Vue3动态使用KeepAlive组件的实现步骤,通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-11-11
  • Vue3 路由页面切换动画 animate.css效果

    Vue3 路由页面切换动画 animate.css效果

    这篇文章主要介绍了Vue3路由页面切换动画animate.css效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • vue实现拖拽效果

    vue实现拖拽效果

    这篇文章主要为大家详细介绍了vue实现拖拽效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Vue实现自动检测以及版本的更新

    Vue实现自动检测以及版本的更新

    当用户在当前站点停留时间比较长,中途站点进行升级更新之后,用户如果不刷新页面就任然停留在旧的页面里,如何让用户收到一个提示,引导用户进行更新操作呢?下面给大家介绍如何站点更新如何在生产环境提示用户更新,进行页面刷新操作,核心原理其实很简单
    2023-03-03
  • Vue3文件下载方法实现的简单代码

    Vue3文件下载方法实现的简单代码

    在Web开发中,文件下载可通过多种方式实现,下面这篇文章主要介绍了Vue3文件下载方法实现的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10

最新评论