1.安装
npm install ali-oss --save
:安装阿里oss的skd安装包。
2.初始化Client
oss实例对象
const OSS = require("ali-oss")
:导入sdk。const client = new OSS({})
:创建oss实例并赋值给一个变量。
new OSS
中配置对象说明
region
:填写Bucket所在地域。如:'oss-cn-hangzhou'。accessKeyId
:阿里云主账号的AccessKey
,或者arm角色对应的秘钥。accessKeySecret
:阿里云主账号的AccessKey Secret
,或者arm角色对应的秘钥。bucket
:存储空间(bucket)名称。authorizationV4
:是否开启V4签名算法,默认false。
const OSS = require("ali-oss");
// 初始化OSS客户端。请将以下参数替换为您自己的配置信息。
const client = new OSS({
region: process.env.OSS_REGION, // 示例:'oss-cn-hangzhou',填写Bucket所在地域。
accessKeyId: process.env.OSS_ACCESS_KEY_ID, // 确保已设置环境变量OSS_ACCESS_KEY_ID。
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET, // 确保已设置环境变量OSS_ACCESS_KEY_SECRET。
bucket: process.env.OSS_BUCKET, // 示例:'my-bucket-name',填写存储空间名称。
authorizationV4: true,
});
module.exports = client;
3.使用client.put()
上传文件到oss,并完成上传接口
client.put(fileName,fileBuffer)
:SDK提供上传到oss的方法。fileName
文件名,fileBuffer
上传文件的文件流。
这两个参数都可通过前端传过来文件对应的file
字段文件对象获取,file.originalname
表示源文件名,file.buffer
表示文件流。
上传接口注意事项
一般情况前端使用
multipart/form-data
的数据类型完成上传任务。所以需要使用multer
中间件来处理此类型数据。
npm install multer
:下载multer中间件。const multer = require("multer")
:导入。const storage = multer.memoryStorage()
:设置multer的存储方法,memoryStorage
表示存储在内存中(默认方式)。const upload = multer({ storage: storage });
:创建multer中间件实例并赋值给一个变量,storage
表示存储引擎,它定义了如何处理上传的文件。upload.single("file")
:对应路由中使用multer中间件示例用来处理文件上传,single
表示单文件上传(array
多选),file
表示接受文件的字段名称(提供给前端)。- 注意:私密
Bucket
内的文件默认方法bucket域名加文件名无法直接访问,需要使用client.signatureUrl()
方法生成带签名的URL才能正常访问。链接
const client = require("./ossInfo.js");
const multer = require("multer");
const router = require("express").Router();
// 创建 Multer 中间件实例
const storage = multer.memoryStorage(); // 使用内存存储以避免文件写入磁盘
const upload = multer({ storage: storage }); // storage存储引擎,它定义了如何处理上传的文件
let fileName = "";
// 上传文件到 OSS
async function uploadFileToOSS(file) {
fileName = "";
try {
let originalname = file.originalname; // 使用原始文件名
let index = originalname.lastIndexOf(".");
let name = originalname.substring(0, index);
let typeName = originalname.substring(index + 1);
fileName = name + "-" + new Date().getTime() + "." + typeName;
await client.put(fileName, file.buffer);
console.log(file);
return `https://oss.tzof.net/${fileName}`;
} catch (error) {
console.error("上传文件失败:", error);
throw error;
}
}
// 生成带签名的URL
async function generateSignedUrl() {
try {
const objectName = fileName;
const expires = 3600; // 过期时间,单位秒
// 生成带签名的URL
const url = await client.signatureUrl(objectName, { expires });
return url;
} catch (error) {
console.error("Error generating signed URL:", error);
}
}
// 文件上传路由
router.post("/upload", upload.single("file"), async (req, res) => {
try {
await uploadFileToOSS(req.file);
const fileUrl = (await generateSignedUrl()).replace(
"http://tzof-oss.oss-cn-hangzhou.aliyuncs.com",
"https://oss.tzof.net"
);
console.log("文件上传成功文件名:", fileName, "访问地址:", fileUrl);
res.json({
code: 200,
msg: `上传成功`,
avatarUrl: fileUrl,
fileName,
});
} catch (error) {
console.log(error);
res.json({ code: 0, success: false, message: "文件上传失败" });
}
});
module.exports = router;