napi_wdossclient.cpp 6.47 KB
//
// Created on 2024/4/24.
//
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
// please include "napi/native_api.h".


#include "napi/native_api.h"
#include "hilog/log.h"

#include "napi/native_api.h"
#include <iostream>
#include <sstream>
#include "napi_util.h"
// #include <alibabacloud/oss/Export.h>
#include "alibabacloud/oss/OssClient.h"
#include <alibabacloud/oss/client/ClientConfiguration.h>
#include <alibabacloud/oss/auth/CredentialsProvider.h>

using namespace AlibabaCloud::OSS;

static napi_value WDOssClient_InitSdk(napi_env env, napi_callback_info info) {
   
    AlibabaCloud::OSS::InitializeSdk();
    return nullptr;
}

static napi_value WDOssClient_UnInitSdk(napi_env env, napi_callback_info info) {
   
    AlibabaCloud::OSS::ShutdownSdk();
    return nullptr;
}

static napi_value WDOssClient_IsSdkInitialized(napi_env env, napi_callback_info info) {  
    napi_value result;
    bool isSdkInit = false;
    isSdkInit = AlibabaCloud::OSS::IsSdkInitialized();
    napi_get_boolean(env, isSdkInit, &result);    
    return result;
}


static napi_value WDOssClient_UploadFile(napi_env env, napi_callback_info info) {  
    napi_value result;
    bool isSuccess = false;
    
    napi_value IsInitResult;
    bool bIsInit = false;
    IsInitResult = WDOssClient_IsSdkInitialized(env,info);
    napi_get_value_bool(env,IsInitResult,&bIsInit);
    if(!bIsInit)
    {
        AlibabaCloud::OSS::InitializeSdk();
    }
    
    size_t argc = 7;
    napi_value args[6] = {nullptr};
    napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
    napi_valuetype valuetype0;
    napi_typeof(env, args[0], &valuetype0);
    napi_valuetype valuetype1;
    napi_typeof(env, args[1], &valuetype1);
    napi_valuetype valuetype2;
    napi_typeof(env, args[2], &valuetype2);
    napi_valuetype valuetype3;
    napi_typeof(env, args[3], &valuetype3);
    napi_valuetype valuetype4;
    napi_typeof(env, args[4], &valuetype4);
    napi_valuetype valuetype5;
    napi_typeof(env, args[5], &valuetype5);
    napi_valuetype valuetype6;
    napi_typeof(env, args[6], &valuetype6);
    
    std::string _Endpoint;
    _Endpoint = utf8StringFromValue(env, args[0]);

    std::string _accessKeySecret;
    _accessKeySecret = utf8StringFromValue(env, args[1]);
    
    std::string _accessKeyId;
    _accessKeyId = utf8StringFromValue(env, args[2]);
    
    std::string _sessionToken;
    _sessionToken = utf8StringFromValue(env, args[3]);
    
    std::string _BucketName;
    _BucketName = utf8StringFromValue(env, args[4]);
    
    std::string _ObjectName;
    _ObjectName = utf8StringFromValue(env, args[5]);
    
    std::string _localFileName;
    _localFileName = utf8StringFromValue(env, args[6]);
    
    if(_Endpoint.empty() || _accessKeySecret.empty() || _sessionToken.empty() || _accessKeyId.empty() ||
        _BucketName.empty() || _ObjectName.empty() || _localFileName.empty())
    {
        isSuccess = false;
        napi_get_boolean(env, isSuccess, &result);     
        AlibabaCloud::OSS::ShutdownSdk();
        return result;
    }
    
     /* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填写Bucket名称,例如examplebucket。*/
    std::string BucketName = "examplebucket";
    /* 填写文件完整路径,例如exampledir/exampleobject.txt。文件完整路径中不能包含Bucket名称。*/
    std::string ObjectName = "exampledir/exampleobject.txt";
    //本地文件名称
    std::string localFileName = "D:\\localpath\\examplefile.txt";
           
    ClientConfiguration conf;
    std::string accessKeyId = "1111111111";
    std::string accessKeySecret = "222222222";
    std::string sessionToken = "333333333";
    
    if(!_Endpoint.empty()){
        Endpoint = _Endpoint;
    }    
    if(!_accessKeySecret.empty()){
        accessKeySecret = _accessKeySecret;
    }
    if(!_accessKeyId.empty()){
        accessKeyId = _accessKeyId;
    }
    if(!_sessionToken.empty()){
        sessionToken = _sessionToken;
    }
    if(!_BucketName.empty()){
        BucketName = _BucketName;
    }
    if(!_ObjectName.empty()){
        ObjectName = _ObjectName;
    }
    if(!_localFileName.empty()){
        localFileName = _localFileName;
    }
    
//     auto credentialsProvider = std::make_shared<Credentials>(accessKeyId,accessKeySecret,sessionToken);
//     auto client = std::make_shared<OssClient>(Endpoint, credentialsProvider, &conf);
    
    auto client = std::make_shared<OssClient>(Endpoint, accessKeyId,accessKeySecret,sessionToken,conf);

     /* 上传文件。*/
    /* 填写本地文件完整路径,例如D:\\localpath\\examplefile.txt,其中localpath为本地文件examplefile.txt所在本地路径。*/
    auto outcome = client->PutObject(BucketName, ObjectName,localFileName);
    if (!outcome.isSuccess()) {
        /* 异常处理。*/
        std::cout << "PutObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        isSuccess = false;
           
    }
    napi_get_boolean(env, isSuccess, &result); 
    
    AlibabaCloud::OSS::ShutdownSdk();
    return result;
}


EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{
    napi_property_descriptor desc[] = {
        { "WDOssClient_InitSdk", nullptr, WDOssClient_InitSdk, nullptr, nullptr, nullptr, napi_default, nullptr },
        { "WDOssClient_UnInitSdk", nullptr, WDOssClient_UnInitSdk, nullptr, nullptr, nullptr, napi_default, nullptr },
        { "WDOssClient_IsSdkInitialized", nullptr, WDOssClient_IsSdkInitialized, nullptr, nullptr, nullptr, napi_default, nullptr },
        { "WDOssClient_UploadFile", nullptr, WDOssClient_UploadFile, nullptr, nullptr, nullptr, napi_default, nullptr }
    };
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
    return exports;
}
EXTERN_C_END

static napi_module demoModule = {
    .nm_version = 1,
    .nm_flags = 0,
    .nm_filename = nullptr,
    .nm_register_func = Init,
    .nm_modname = "wdossclient",
    .nm_priv = ((void*)0),
    .reserved = { 0 },
};

extern "C" __attribute__((constructor)) void RegisterWdossclientModule(void)
{
    napi_module_register(&demoModule);
}