🧨 大家好,我是 Smooth,一名大三的 SCAU 前端er
🙌 如文章有误,恳请评论区指正,谢谢!
❤ 写作不易,「点赞」+「收藏」+「转发」 谢谢支持!
背景
近期一个项目由于缺人,我需要负责前后端,在上传图片这个功能上,由于没实现过后端接收并上传至阿里云OSS进行保存的需求,经过网上各种博客的洗礼与寻找,终于完成了从0到1的一步,为了记录一下痛苦的过程以及帮助后人少走弯路,因此写下这篇博客。
前置知识
- 拥有一台服务器,这里我选用阿里云
 - 安装了 Node 环境(具体操作请自行查看官网文档 https://nodejs.org/zh-cn/download/)
 
准备好后,那么便开始,争取十分钟拿下!
准备阶段 创建Bucket
1. 进入到阿里云平台,进入控制台,点击 对象存储OSS
 

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

3. 然后输入 Bucket 名称,选择地域 (地域最好是选择你所使用OSS存储的地方)。
 
把读写权限设置为公共读,公共读表示谁都可以访问

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

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

我先说说他们的区别:
- 继续使用 AccessKey,是获得完全权限
 - 子用户 AccessKey,需要我们配置它的权限,比较安全
 
因此我们选择 开始使用子用户 AccessKey
按照下图填写(登录名称和显示名称建议保持一致)
点击 “确定” 后创建子用户并得到
accessKeyId,和accessKeySecret,这个非常重要且仅出现一次,要立即记下来,我们后面会用到!

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

然后我们就可以使用 阿里云 OSS 上传文件了,上传方式有两种:
- 在阿里云控制台直接上传
 - 使用 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!'))
 
代码解释:
- 我这里使用到的 
SDK有multer以及multer-aliyun-oss,这两个都可以在 github 上找到 - 创建 
multer-aliyun-oss实例时,config 填入必要的参数,destination 字段作用为存储到 OSS 中的文件路径,如果不加 destination 字段默认存储到 OSS 根路径,如果加了就存到对应路径,下面代码中我存储的路径为 域名/public/images,如下图: 

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. 找到添加域名

2. 输入要绑定的域名即可
比如 www.申请的名字.top ,同时勾选上下方的 自动添加 CNAME 记录 即可
 
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 位置,点开该图片,如下图一样,在 自有域名 一栏,勾选上自有域名

当然,你也可以选择在图片上传成功后同时向数据库写入对应的图片 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的原型和原型链(新手懵懂想学会原型链?看这篇文章就足够啦!!!)》






![[ docker相关知识 ] 删除 docker 拉取的镜像 -- 释放内存](https://img-blog.csdnimg.cn/605981e863dc4372b3e955af6a084f46.png)





![[oeasy]python0037_终端_terminal_电传打字机_tty_shell_控制台_console_发展历史](https://img-blog.csdnimg.cn/img_convert/130715e54bca66186515c3e2c34a831f.jpeg)






