笔记---华为OBS存储使用Nodejs版本

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近在一个新的项目上使用了nodejs,使用的框架是Fastify,其中需要上传附件到华为的OBS中,按照官方文档开发也是遇到了一些问题。


一、 获取AK和SK

购买后从官网获取

具体过程可以参考官方文档(https://support.huaweicloud.com/sdk-nodejs-devg-obs/obs_29_0102.html

二、过程

1 引入和注册插件

1.1 安装插件

npm install esdk-obs-nodejs

1.2 新建obs.js文件

// 引入obs库
// 使用npm安装
var ObsClient = require('esdk-obs-nodejs');
// 如果需要代理可以安装使用
// var ProxyAgent = require('proxy-agent');
// 使用源码安装(乳鸽)
// var ObsClient = require('./lib/obs');
const config = require('../config/config');

// 创建ObsClient实例
const obsClient = new ObsClient({
        //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
        //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
        access_key_id: `${config.huaweiObs['AccessKeyId']}`,
        secret_access_key: `${config.huaweiObs['SecretAccessKey']}`,
        //这里以华北-北京四为例,其他地区请按实际情况填写
        // 写你自己的地址
        server: 'https://obs.cn-north-4.myhuaweicloud.com',
        max_retry_count : 1,
        timeout : 200,
        ssl_verify : false,
        long_conn_param : 0,
        // http_agent : new ProxyAgent('*** Provide your Network proxy ***') // 配置网络代理
});
module.exports = obsClient;

注:这里的server地址不需要加上桶名,和调用华为OBS的API的方式不同,调API需要在使用的地址上拼接上桶名,但是nodejs使用的sdk的方式,桶名作为参数进行使用。

其中的配置config,我写在了config.js中

'use strict'

const dotenv = require('dotenv');
const path = require('path');
const envFile = process.env.NODE_ENV ? `.env.${process.env.NODE_ENV}` : '.env';
dotenv.config({ path: path.resolve(process.cwd(), envFile) });

const config = {
	huaweiObs: { 
	    BucketName: "your BucketName", 
	    AccessKeyId: "your AccessKeyId", 
	    SecretAccessKey: "your SecretAccessKey",
    },
}
module.exports = config;

1.3 注册插件

由于的目录结构如图所示
Fastify项目文件目录结构
因此在注册插件时使用的的方式时
在app.js文件中

'use strict'

const path = require('node:path')
const AutoLoad = require('@fastify/autoload')
const yourPlugin = require('/your_path/yourPlugin');
module.exports = async function (fastify, opts) {
  fastify.register(AutoLoad, {
    dir: path.join(__dirname, 'plugins'),
    options: Object.assign({}, opts)
  })
  fastify.register(AutoLoad, {
    dir: path.join(__dirname, 'routes'),
    options: Object.assign({}, opts)
  })
  // fastify.decorate('currentUser', null);
  
  //也可以采用直接引入注册的方式
  fastify.register(yourPlugin)
}

2 文件操作

在huaweiObsLib.js中统一处理obs的上传文件操作。

2.1 文件上传

//huaweiObsLib.js
'use strict'
const obsClient = require('../plugins/obs')
// 如果Obs桶中是按照目录来分类的话,需要设置文件夹目录
const obs_path ="folder_catalogue/"
const BucketName = 'BucketName ' // 可以取配置中的桶名
async function uploadFile(file) {
    try {
        const ext = file.filename.split(".")[1].toString() || ''
        const new_filename = `${file.uuid}.${ext}`
        const result = await obsClient.putObject({
            Bucket : BucketName,
            Key : obs_path + new_filename,
            // SourceFile : file.data,  // localfile为待上传的本地文件路径,需要指定到具体的文件名
            // Metadata:  { meta1: 'value1', meta2: 'value2'},
            Body: file.data,
            ContentType: file.file_type
        })
        if (result.CommonMsg.Status < 300) {
            return { status: true, statusCode: result.CommonMsg.Status, data: result.InterfaceResult };
        } else {
            return { status: false, statusCode: result.CommonMsg.Status, data: result.CommonMsg.Message };
        }
    } catch (err) {
        return { status: false, statusCode: 500, data: err }
    }
}

在请求接口中的调用,可以直接写在路由文件中,也可以写在控制器中,这基于不同的路由书写方式。

const Attachment = require('../models/Attachment')
const huaweiObsLib= require('../lib/huaweiObsLib')

module.exports = async function (fastify, opts) {
  fastify.get('/upload_file', async function (request, reply) {
    try {
        const data = await request.file();
        const uuid = crypto.randomBytes(16).toString('hex')
        let fileSize = data.file.bytesRead
        const attachment = new Attachment({filename: data.filename, metadata: data.mimetype, length: fileSize, uuid:uuid})
        const res = await huaweiObsLib.uploadFile({data: data.file, uuid: uuid, file_type: data.mimetype, filename: data.filename})
        if (res.statusCode < 300) {
        	await attachment.save()
            return reply.send({ status: true, statusCode: 200, message: 'File uploaded successfully', data: info });
        } else {
            return reply.status(res.statusCode).send({ status: false, statusCode: res.statusCode, message: res.message });
        }
    } catch (error) {
        throw boom.boomify(error);
    }
  })
}

2.2 文件下载

//huaweiObsLib.js
'use strict'
const obsClient = require('../plugins/obs')
// 如果Obs桶中是按照目录来分类的话,需要设置文件夹目录
const obs_path ="folder_catalogue/"
const BucketName = 'BucketName ' // 可以取配置中的桶名

async function downloadFile(file) {
    try {
        const ext = file.filename.split(".")[1].toString() || ''
        const new_filename = `${file.uuid}.${ext}`
        const result = await obsClient.getObject({ Bucket: BucketName, Key: obs_path + new_filename,
            // 是否将对象以流(stream.Readable)的形式返回。
            SaveAsStream: true,
            // SaveByType: 'file'
        })
        if (result.CommonMsg.Status < 300) {
            return { status: true, statusCode: result.CommonMsg.Status, data: result.InterfaceResult };
        } else {
            return { status: false, statusCode: result.CommonMsg.Status, data: result.CommonMsg.Message };
        }
    } catch (err) {
        return { status: false, statusCode: 500, data: err }
    }
}

在请求接口中的调用

const Attachment = require('../models/Attachment')
const huaweiObsLib= require('../lib/huaweiObsLib')

module.exports = async function (fastify, opts) {
  fastify.get('/download_file', async function (request, reply) {
    try {
        onst id = request.query.id
        const attachment = await Attachment.findById(id)
        if (!attachment) {
            return reply.status(404).send({ statusCode: 404, message: 'File not found' });
        }
        const res = await huaweiObsLib.downloadFile({uuid: attachment.uuid, filename: attachment.filename})
        if (res.statusCode < 300) {
            reply.header('Content-Type', res.data.ContentType);
            // const base64Data = Buffer.from(res.data.Content).toString('base64');
            // const dataUrl = `data:${res.data.ContentType};base64,${base64Data}`;
            return reply.send(res.data.Content);
        } else {
            return reply.status(res.statusCode).send({ status: false, statusCode: res.statusCode, message: res.message });
        }
    } catch (error) {
        throw boom.boomify(error);
    }
  })
}

2.3 文件删除

//huaweiObsLib.js
'use strict'
const obsClient = require('../plugins/obs')
// 如果Obs桶中是按照目录来分类的话,需要设置文件夹目录
const obs_path ="folder_catalogue/"
const BucketName = 'BucketName ' // 可以取配置中的桶名

async function deleteFile(file) {
    try {
        const ext = file.filename.split(".")[1] || ''
        const new_filename = `${file.uuid}.${ext}`
        const result = await obsClient.deleteObject({
            Bucket: BucketName,
            Key: obs_path + new_filename
        })
        if (result.CommonMsg.Status < 300) {
            return { status: true, statusCode: result.CommonMsg.Status, data: result.InterfaceResult };
        } else {
            return { status: false, statusCode: result.CommonMsg.Status, data: result.CommonMsg.Message };
        }
    } catch (err) {
        return { status: false, statusCode: 500, data: err }
    }
}

在请求接口中的调用

const Attachment = require('../models/Attachment')
const huaweiObsLib= require('../lib/huaweiObsLib')

module.exports = async function (fastify, opts) {
  fastify.get('/delete_file', async function (request, reply) {
    try {
        const id = request.query.id
        const attachment = await Attachment.findById(id)
        if (!attachment) {
            return reply.status(404).send({ statusCode: 404, message: 'File not found' });
        }
        const res = await huaweiObsLib.deleteFile({uuid: uuid, filename: filename})
        if (res.statusCode < 300) {
        	await this.findByIdAndDelete(id)
            return reply.status(res.statusCode).send(res);
        } else {
            return reply.status(res.statusCode).send({ status: false, statusCode: res.statusCode, message: res.message });
        }
    } catch (error) {
        throw boom.boomify(error);
    }
  })
}

三、路由

Fastify项目的路由注册方式的记录
在app.js中注册路由routes

'use strict'

const path = require('node:path')
const AutoLoad = require('@fastify/autoload')
const yourPlugin = require('/your_path/yourPlugin');
module.exports = async function (fastify, opts) {
  fastify.register(AutoLoad, {
    dir: path.join(__dirname, 'routes'),
    options: Object.assign({}, opts)
  })
}

1

'use strict'

module.exports = async function (fastify, opts) {
  fastify.get('/users', async function (request, reply) {
    return { status: true, statusCode: 200, message: 'Hello, World!' }
  })
}

2

'use strict'
const boom = require('boom')
const usersController = require('../controllers/usersController')

const routes = [
	{
        method: 'get',
        url: '/login',
        handler: usersController.login
    },
    {
        method: 'get',
        url: '/users/index',
        handler: usersController.getUser
    },

]
  
module.exports = async function (fastify, opts) {
    routes.forEach((route, index) => {
        fastify.route(route)
    })
}
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于您提出的问题,我可以回答。华为 OBS 存储是一种云存储服务,它可以为开发者提供预定义的标准对象存储服务,并可以实现数据的安全存储、复制、备份和恢复。它使用Flutter作为其开发平台,可以实现快速开发和部署,提高了开发者项目的效率。 ### 回答2: 华为obs存储是一种云存储服务,而flutter是一种跨平台的移动应用开发框架。华为obs存储和flutter可以结合使用,实现在移动应用中使用存储功能。 使用flutter开发应用时,可以利用华为obs存储的API和SDK,实现文件上传、下载、管理等功能。开发者可以通过调用华为obs存储的接口,将移动应用中的文件传输到华为云存储空间中,或者从华为云存储空间中下载文件到应用中进行使用华为obs存储提供了稳定可靠的存储服务,具备高可用性和高扩展性,能够满足不同规模的应用需求。同时,华为obs存储还提供了数据加密、多副本备份等安全措施,保障数据的安全性和可靠性。 在使用flutter开发应用时,如果需要使用存储功能,可以选择集成华为obs存储,通过华为obs存储的API进行文件的上传和下载操作,实现应用和云存储之间的数据传输。这样可以充分利用云存储的优势,提高应用的数据存储和传输效率,为用户提供更好的使用体验。 综上所述,华为obs存储和flutter可以很好地结合使用,实现移动应用中的云存储功能。开发者可以通过调用华为obs存储的接口,实现文件的上传、下载和管理等操作,提升应用的数据存储和传输效率,为用户提供更好的使用体验。 ### 回答3: 华为OBS存储华为云提供的对象存储服务,而Flutter是由Google开发的跨平台移动应用开发框架。 华为OBS存储可以用于存储各种类型的数据,包括图片、视频、文档等。在Flutter开发中,我们可以利用华为OBS存储来上传、下载和管理这些数据。 首先,我们需要在华为云平台上创建一个OBS存储桶,用于存放我们的数据。然后,通过Flutter提供的网络请求库,我们可以使用华为OBS提供的API接口来实现文件的上传和下载。 在Flutter中,我们可以使用一些第三方库来简化与华为OBS存储的交互。例如,可以使用dio库来发送网络请求,通过设置请求头和参数来实现文件的上传和下载。我们可以使用华为OBS提供的Access Key和Secret Key来进行身份验证,并指定需要上传或下载的文件路径。 除了上传和下载,我们还可以利用华为OBS存储的其他功能。例如,可以通过Flutter应用程序与华为OBS存储进行通信,实时获取存储桶的状态信息,如获取当前存储桶中文件的列表、删除指定的文件等操作。 综上所述,华为OBS存储与Flutter的结合可以实现方便、高效的文件上传、下载及管理功能。通过利用华为OBS存储在移动应用开发中的优势,我们可以提供更好的用户体验和数据管理能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值