【node-express】oss图片上传

简介

源码地址:https://github.com/thinkasany/nestjs-course-code/tree/master/sdk/qiniu
配置bucket,然后去域名商后台解析cname,一直未配置成功可以查看官方文档,我重新注册了个二级域名就通过了。

通过dotenv解析env文件中的账号配置信息,path.resolve(__dirname, '../.env'); 解决文件路径问题。

我的全栈项目nest中其实也有这部分的接口,但是毕竟项目文件太多了,express搭建一个更简易的,方便平常做一些功能。对nest感兴趣的可以看下面里面的写法,express足够的可以看上面的源码地址。
https://github.com/thinkasany/shop-server-nest
在这里插入图片描述

实现效果

在这里插入图片描述
在这里插入图片描述

代码

env

QINIU_ACCESS_KEY = ""
QINIU_SECRET_KEY = ""
QINIU_BUCKET = ""

service

// qiniuService.js

const qiniu = require('qiniu');
const path = require('path');
const dotenv = require('dotenv');
const envPath = path.resolve(__dirname, '../.env');
dotenv.config({ path: envPath });
const accessKey = process.env.QINIU_ACCESS_KEY;
const secretKey = process.env.QINIU_SECRET_KEY;
const bucket = process.env.QINIU_BUCKET;

const mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
const config = new qiniu.conf.Config();
const formUploader = new qiniu.form_up.FormUploader(config);
const putExtra = new qiniu.form_up.PutExtra();

async function uploadToQiniu(fileBuffer) {
  return new Promise((resolve, reject) => {
    const options = {
      scope: bucket,
    };
    const putPolicy = new qiniu.rs.PutPolicy(options);
    const uploadToken = putPolicy.uploadToken(mac);

    formUploader.put(uploadToken, null, fileBuffer, putExtra, (respErr, respBody, respInfo) => {
      if (respErr) {
        reject(respErr);
      } else if (respInfo.statusCode === 200) {
        const imageUrl = `http://qniu.xxlb.site//${respBody.key}`;
        resolve(imageUrl);
      } else {
        reject(new Error(`Upload failed: ${respInfo.statusCode}, ${respBody.error}`));
      }
    });
  });
}

module.exports = {
  uploadToQiniu,
};

route

const multer = require('multer');
const storage = multer.memoryStorage();
const upload = multer({ storage: storage });
const qiniuService = require('../service/qiniu');

module.exports = function (app) {
  app.get('/health',  (req, res) => {
    return res.json({ message: 'OK', data: `Time Is ${new Date().toString()}` });
  });

  app.post('/upload', upload.single('image'), async (req, res) => {
    try {
      const fileBuffer = req.file.buffer;
      const imageUrl = await qiniuService.uploadToQiniu(fileBuffer);
      res.status(200).json({ imageUrl });
    } catch (error) {
      res.status(500).json({ error: 'Upload failed', message: error.message });
    }
  });

};

main.js

const router = require('./router');
const express = require('express');
const logger = require('./utils/logger');
const http = require('http');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json());
const PORT = 3001;

router(app);

const server = http.createServer(app);
app.set('port', PORT);
server.listen(PORT, '0.0.0.0');

server.on('error', (err) => {
  if (err.code === 'EADDRINUSE') {
    logger.log('warn', 'warning! listen address is in used~!');
    server.close(function () {
      process.exit();
    });
  } else {
    logger.log('error',  {
      type: 'server error',
      message: err.message,
      stack: err.stack,
    });
  }
});

server.on('listening', () => {
  const host = server.address().address;
  const port = server.address().port;
  logger.log('info', `app listening at http://${host}:${port}`);
});

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值