手把手教你从0到1通过 Express 完成图片上传并保存至阿里云OSS功能(附详细源码)

🧨 大家好,我是 Smooth,一名大三的 SCAU 前端er
🙌 如文章有误,恳请评论区指正,谢谢!
❤ 写作不易,「点赞」+「收藏」+「转发」 谢谢支持!

背景

近期一个项目由于缺人,我需要负责前后端,在上传图片这个功能上,由于没实现过后端接收并上传至阿里云OSS进行保存的需求,经过网上各种博客的洗礼与寻找,终于完成了从0到1的一步,为了记录一下痛苦的过程以及帮助后人少走弯路,因此写下这篇博客。

前置知识

  1. 拥有一台服务器,这里我选用阿里云
  2. 安装了 Node 环境(具体操作请自行查看官网文档 https://nodejs.org/zh-cn/download/

准备好后,那么便开始,争取十分钟拿下!

准备阶段 创建Bucket

1. 进入到阿里云平台,进入控制台,点击 对象存储OSS

image.png

2. 点击 Bucket列表,再创建 Bucket

image.png

3. 然后输入 Bucket 名称,选择地域 (地域最好是选择你所使用OSS存储的地方)。

把读写权限设置为公共读,公共读表示谁都可以访问

image.png

4. 这样一个OSS存储就创建好了,接下来需要配置 AccessKey,把鼠标悬浮在右上角的头像上,点击 AccessKey 管理

image.png

5. 然后就会弹出安全提示,让我们选择继续使用 AccessKey,还是使用子用户 AccessKey

image.png

我先说说他们的区别:

  • 继续使用 AccessKey,是获得完全权限
  • 子用户 AccessKey,需要我们配置它的权限,比较安全

因此我们选择 开始使用子用户 AccessKey

按照下图填写(登录名称和显示名称建议保持一致)

点击 “确定” 后创建子用户并得到 accessKeyId,和 accessKeySecret,这个非常重要且仅出现一次,要立即记下来,我们后面会用到!

image.png

6. 返回后点击添加权限,我已经添加过了,请自行添加,见下图

image.png

然后我们就可以使用 阿里云 OSS 上传文件了,上传方式有两种:

  1. 在阿里云控制台直接上传
  2. 使用 OpenAPI 上传,即本篇文章讲的重点(通过 API 来上传)

开发阶段

1. Express代码

先直接上 Express 代码,后文有对应解释
记得在 node app.js 启动 Express 项目前,先 npm 安装依赖

  • npm install express
  • npm install body-parser
  • npm install multer
  • npm install multer-aliyun-oss
// app.js
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
// OSS 相关
const multer = require('multer')//npm i multer
const MAO = require('multer-aliyun-oss');//npm install --save multer-aliyun-oss

// 允许跨域访问
app.all('*', function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  res.header("X-Powered-By", ' 3.2.1');
  res.header("Content-Type", "application/json;charset=utf-8");
  next();
});

app.use(express.json())
app.use(express.urlencoded({ extended: false }))


const uplod = multer({
  storage: MAO({
       config: {
           region:'oss-cn-shenzhen',
           accessKeyId: '<accessKeyId>',
           accessKeySecret: '<accessKeySecret>',
           bucket: 'bucket'
       },
       destination: 'public/images'
   })
});

app.post('/upload', uplod.single('file'), (req, res) => {
    // 可以自定义返回结果,推荐打印 req.file 查看,再决定如何返回数据给前端
    const file = req.file;
    console.log(file);
    res.send({
        status: '上传成功',
        code: 200,
        url: `https://你的bucket名字.oss-cn-地区.aliyuncs.com/public/images/${file.filename}`
    });
})


app.listen(3002, () => console.log('Example app listening on port 3002!'))

代码解释:

  • 我这里使用到的 SDKmulter 以及 multer-aliyun-oss,这两个都可以在 github 上找到
  • 创建 multer-aliyun-oss 实例时,config 填入必要的参数,destination 字段作用为存储到 OSS 中的文件路径,如果不加 destination 字段默认存储到 OSS 根路径,如果加了就存到对应路径,下面代码中我存储的路径为 域名/public/images,如下图:

image.png

2. 访问

前端携带图片文件访问该接口就行,我这里给个 demo,使用的是 uView 的 upload 组件

<template>
	<view>
		<u-upload ref="uUpload" :action="action" :auto-upload="true" ></u-upload>
		<u-button @click="submit">提交</u-button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				action: 'http://服务器域名/upload',
				filesArr: []
			}
		},
		methods: {
			submit() {
				let files = [];
				// 通过filter,筛选出上传进度为100的文件(因为某些上传失败的文件,进度值不为100,这个是可选的操作)
				files = this.$refs.uUpload.lists.filter(val => {
					return val.progress == 100;
				})
				// 如果您不需要进行太多的处理,直接如下即可
				// files = this.$refs.uUpload.lists;
				console.log(files)
			}
		}
	}
</script>

其他知识

如果你觉得 OSS 这域名太丑,想自定义访问图片时的域名,那么可进行自定义域名操作

只不过要求是你必须要有一个自己的域名,可以买 top 的域名,非常便宜

1. 找到添加域名

image.png

2. 输入要绑定的域名即可

比如 www.申请的名字.top ,同时勾选上下方的 自动添加 CNAME 记录 即可
image.png

3. 使用

然后对上方代码中的 url 稍作更改
app.post('/upload', uplod.single('file'), (req, res) => {
    const file = req.file;
    console.log(file);
    res.send({
        status: '上传成功',
        code: 200,
        url: `https://www.申请的域名名字.top/public/images/${file.filename}`
    });
})
最后

在上传到的阿里云 OSS 位置,点开该图片,如下图一样,在 自有域名 一栏,勾选上自有域名

image.png

当然,你也可以选择在图片上传成功后同时向数据库写入对应的图片 URL 来存储起路径


最后

我是 Smoothzjc,致力于产出更多且不仅限于前端方面的优质文章

大家也可以关注我的公众号 @ Smooth前端成长记录,及时通过移动端获取到最新文章消息!

写作不易,「点赞」+「收藏」+「转发」 谢谢支持❤

往期推荐

《手把手教前端从0到1通过 Node + Express 开发简易接口,项目开发+部署服务器(亲身痛苦经历)》

《都2022年了还不考虑来学React Hook吗?6k字带你从入门到吃透》

《一份不可多得的 Webpack 学习指南(1万字长文带你入门 Webpack 并掌握常用的进阶配置)》

《通过 React15 ~ 17 的优化迭代来简单聊聊 Fiber》

《【offer 收割机之面试必备】一篇非常全面的 从 URL 输入到页面展现的全过程 精华梳理》

《【offer 收割机之手写系列】10分钟带你掌握原理并手写防抖与节流的立即/非立即执行版本》

《【offer 收割机之 CSS 回顾系列】请你解释一下什么是 BFC ?他的应用场景有哪些?》

《Github + hexo 实现自己的个人博客、配置主题(超详细)》

《10分钟让你彻底理解如何配置子域名来部署多个项目》

《一文理解配置伪静态解决 部署项目刷新页面404问题

《带你3分钟掌握常见的水平垂直居中面试题》

《【建议收藏】长达万字的git常用指令总结!!!适合小白及在工作中想要对git基本指令有所了解的人群》

《浅谈javascript的原型和原型链(新手懵懂想学会原型链?看这篇文章就足够啦!!!)》

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue3是一种流行的JavaScript框架,用于构建用户界面。它具有响应式数据绑定、组件化开发和虚拟DOM等特性,使得开发者可以更高效地构建交互式的Web应用程序。 要在Vue3中实现上传图片阿里云OSS,你可以按照以下步骤进行操作: 1. 安装依赖:首先,你需要安装阿里云OSS的JavaScript SDK。可以使用npm或yarn命令来安装,例如: ``` npm install ali-oss ``` 2. 配置OSS客户端:在Vue3的代码中,你需要创建一个OSS客户端实例,并配置相关参数,如AccessKeyId、AccessKeySecret、Endpoint等。这些参数可以在阿里云OSS控制台中获取。 3. 创建上传组件:在Vue3中,你可以创建一个上传组件,用于选择图片文件并触发上传操作。可以使用`<input type="file">`元素来实现文件选择功能,并监听其`change`事件。 4. 上传图片:在上传组件中,你可以编写上传图片的逻辑。当用户选择了图片文件后,你可以通过OSS客户端调用`put`方法来上传图片文件到阿里云OSS。 下面是一个简单的示例代码,演示了如何在Vue3中上传图片阿里云OSS: ```javascript <template> <div> <input type="file" @change="handleFileChange"> </div> </template> <script> import OSS from 'ali-oss'; export default { methods: { handleFileChange(event) { const file = event.target.files[0]; const client = new OSS({ accessKeyId: 'your-access-key-id', accessKeySecret: 'your-access-key-secret', bucket: 'your-bucket-name', region: 'your-oss-region', // 其他配置参数... }); // 生成唯一的文件名 const fileName = Date.now() + '-' + file.name; // 调用OSS客户端的put方法上传文件 client.put(fileName, file).then(response => { console.log('上传成功', response); // 在这里可以处理上传成功后的逻辑 }).catch(error => { console.error('上传失败', error); // 在这里可以处理上传失败后的逻辑 }); } } } </script> ``` 请注意,上述代码中的`your-access-key-id`、`your-access-key-secret`、`your-bucket-name`和`your-oss-region`需要替换为你自己的阿里云OSS相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值