onions-node
Version:
onions-node backend
70 lines (65 loc) • 2.1 kB
JavaScript
const fs = require('fs')
const express = require('express')
const multer = require('multer')
const {v4: uuidV4} = require('uuid')
const CdnSDK = require('@razor-node/cdn-sdk')
/**
* 添加CDN上传路由
* @param cdnConfig
* @param config
* @param logger
*/
module.exports = (cdnConfig, config, logger) => {
/*TODO: 暂只支持国内场景,国外场景待支持*/
const router = new express.Router()
const storage = multer.diskStorage({
destination: cdnConfig.tempFilePath || config.tempFilePath,
filename: function (req, file, cb) {
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
cb(null, `${uniqueSuffix}-${file.originalname}`)
}
})
const upload = multer({ storage })
const ENV_HOST = {
dev: 'https://keeper-cdn-qa.nioint.com',
test: 'https://keeper-cdn-sit.nioint.com',
stg: 'https://keeper-cdn-stg.nioint.com',
prod: 'https://keeper-cdn.nioint.com',
}
const baseURL = ENV_HOST[cdnConfig.env || config.env]
const cdnSDK = new CdnSDK(baseURL, cdnConfig.app_id, cdnConfig.app_secret)
router.post('/rz/common/api/v1/cdn/upload', upload.single('file'), async (req, res) => {
try {
const file = req.file
const stream = fs.createReadStream(file.path)
const svgContentType = 'image/svg+xml'
const cssContentType = 'text/css; charset=UTF-8'
const isSVG = file.originalname.includes('.svg')
const isCSS = file.originalname.includes('.css')
const body = {
defineFilePath: `${config.project}/upload/${uuidV4()}/${file.originalname}`,
contentType: file.mimetype
}
if (isSVG) {
body['contentType'] = svgContentType
}
if (isCSS) {
body['contentType'] = cssContentType
}
const result = await cdnSDK.upload(stream, file.originalname)
return res.json({
result_code: 'success',
data: {
url: result
}
})
} catch (e) {
logger.error(e)
return res.json({
result_code: 'fail',
message: e.message
})
}
})
return router
}