node.js中完成阿里云OSS的文件上传,完成上传文件接口 multer处理multipart/form-data类型请求体内容

29 阅读3分钟

官方文档

1.安装

  • npm install ali-oss --save:安装阿里oss的skd安装包。

2.初始化Clientoss实例对象

  • 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;