diff --git a/3rdparty/aliyun-oss-c-sdk-3.11.2.zip b/3rdparty/aliyun-oss-c-sdk-3.11.2.zip new file mode 100644 index 0000000..5395089 Binary files /dev/null and b/3rdparty/aliyun-oss-c-sdk-3.11.2.zip differ diff --git a/CMakeLists.txt b/CMakeLists.txt index a007b7e..faaecad 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,10 @@ set(MODULE_NAME "aliyunsdk") # 设置项目名为当前目录名 project(${MODULE_NAME}) + +#set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build" FORCE) +#set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0") +#set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -O0") # 搜索源文件和头文件 file(GLOB_RECURSE SOURCE_FILES "${PROJECT_SOURCE_DIR}/src/*.cpp") file(GLOB_RECURSE HEADER_FILES @@ -42,7 +46,10 @@ else() /usr/local/include/ylib /usr/local/include/fastweb /opt/lua54/include - /usr/local/include) + /usr/local/include + /usr/include/apr-1.0 + /usr/local/include/oss_c_sdk + ) add_definitions(-DfPIC) endif() @@ -59,9 +66,13 @@ else() /opt/lua54/lib/liblua.a pthread /usr/lib/x86_64-linux-gnu/libalibabacloud-sdk-core.so + /usr/local/lib/liboss_c_sdk.so + /usr/lib/x86_64-linux-gnu/libmxml.so + /usr/lib/x86_64-linux-gnu/libapr-1.so + /usr/lib/x86_64-linux-gnu/libaprutil-1.so ) endif() -install(TARGETS ${MODULE_NAME} DESTINATION $,${FASTWEB}/bin/debug/module/${MODULE_NAME},${FASTWEB}/bin/release/module/${MODULE_NAME}>) \ No newline at end of file +install(TARGETS ${MODULE_NAME} DESTINATION $,${FASTWEB}/bin/debug/module/${MODULE_NAME},${FASTWEB}/bin/release/module/${MODULE_NAME}>) diff --git a/build.sh b/build.sh index 8c45173..5bb7894 100755 --- a/build.sh +++ b/build.sh @@ -2,6 +2,30 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" +# 安装阿里云核心 +mkdir tmp +cd tmp +git clone https://gitee.com/yobonianhua/aliyun-openapi-cpp-sdk.git +cd aliyun-openapi-cpp-sdk +sudo sh easyinstall.sh core +cd ${SCRIPT_DIR} + +# 安装阿里云OSS +sudo apt-get install libcurl4-openssl-dev libapr1-dev libaprutil1-dev libmxml-dev -y +cd 3rdparty +rm -rf aliyun-oss-c-sdk-3.11.2 +unzip aliyun-oss-c-sdk-3.11.2.zip +cd aliyun-oss-c-sdk-3.11.2 +mkdir build +cd build +cmake .. +make +make install +cd ${SCRIPT_DIR} + + +# 安装ALIYUN +rm -rf build mkdir build cd build cmake .. diff --git a/src/aliyunoss.cpp b/src/aliyunoss.cpp new file mode 100644 index 0000000..01843a7 --- /dev/null +++ b/src/aliyunoss.cpp @@ -0,0 +1,98 @@ +#include "aliyunoss.h" +#include "dll_interface.h" +#include "aos_log.h" +#include "aos_util.h" +#include "aos_string.h" +#include "aos_status.h" +#include "oss_auth.h" +#include "oss_util.h" +#include "oss_api.h" +#include + +module::aliyun_oss::aliyun_oss() +{ + +} + +module::aliyun_oss::~aliyun_oss() +{ + +} +std::string module::aliyun_oss::put( + const std::string& endpoint, + const std::string& access_key_id, + const std::string& access_key_secret, + const std::string& bucket_name, + const std::string& object_name, + const std::string_view& data + ) +{ + if (aos_http_io_initialize(NULL, 0) != AOSE_OK) { + return "NOT OK INIT"; + } + + aos_pool_t *p = NULL; + aos_string_t bucket; + aos_string_t object; + int is_cname = 0; + aos_table_t *headers = NULL; + aos_table_t *resp_headers = NULL; + oss_request_options_t *options = NULL; + aos_list_t buffer; + aos_buf_t *content = NULL; + aos_status_t *s = NULL; + + aos_pool_create(&p, NULL); + options = oss_request_options_create(p); + + + options->config = oss_config_create(options->pool); + aos_str_set(&options->config->endpoint, endpoint.c_str()); + aos_str_set(&options->config->access_key_id, access_key_id.c_str()); + aos_str_set(&options->config->access_key_secret, access_key_secret.c_str()); + options->config->is_cname = is_cname; + options->ctl = aos_http_controller_create(options->pool, 0); + + + + headers = aos_table_make(p, 1); + apr_table_set(headers, "x-oss-meta-author", "oss"); + aos_str_set(&bucket, bucket_name.c_str()); + aos_str_set(&object, object_name.c_str()); + + aos_list_init(&buffer); + content = aos_buf_pack(options->pool, data.data(), data.length()); + aos_list_add_tail(&content->node, &buffer); + + s = oss_put_object_from_buffer(options, &bucket, &object, + &buffer, headers, &resp_headers); + + std::string return_msg; + if (aos_status_is_ok(s)) { + + } else { + return_msg = "put object from buffer failed,code:"+std::to_string(s->code)+",error_code:"+s->error_code+",error_msg:"+s->error_msg; + } + + + aos_pool_destroy(p); + + aos_http_io_deinitialize(); + + return return_msg; +} + + +void module::aliyun_oss::regist(sol::state* lua) +{ + lua->new_usertype("fw_aliyunoss", + "new", sol::constructors(), + "put", &module::aliyun_oss::put + ); +} + +void module::aliyun_oss::regist_global(const char* name, sol::state* lua) +{ + lua->registry()[name] = this; + (*lua)[name] = this; +} diff --git a/src/aliyunoss.h b/src/aliyunoss.h new file mode 100644 index 0000000..87ac270 --- /dev/null +++ b/src/aliyunoss.h @@ -0,0 +1,23 @@ +#pragma once +#include "basemodule.h" +#include "oss_c_sdk/oss_api.h" +namespace module +{ + /// + /// AliyunOSS + /// + class aliyun_oss:public module::base { + public: + aliyun_oss(); + ~aliyun_oss() override; + + + std::string put(const std::string& endpoint,const std::string& access_key_id,const std::string& access_key_secret,const std::string& bucket_name,const std::string& object_name,const std::string_view& data); + static void regist(sol::state* lua); + private: + // 通过 imodule 继承 + virtual void regist_global(const char* name, sol::state* lua); + virtual void delete_global() { delete this; } + }; +} + diff --git a/src/aliyunsdk.cpp b/src/aliyunsdk.cpp index 980d474..7d3f6e1 100755 --- a/src/aliyunsdk.cpp +++ b/src/aliyunsdk.cpp @@ -4,6 +4,7 @@ #include #include #include +#include "aliyunoss.h" extern "C" { #ifdef _WIN32 DLL_EXPORT @@ -12,8 +13,9 @@ extern "C" { { sol::state* state = static_cast(sol2); module::aliyun_sdk::regist(state); + module::aliyun_oss::regist(state); return 0; - } + } } module::aliyun_sdk::aliyun_sdk() diff --git a/src/aliyunsdk.h b/src/aliyunsdk.h index 49e6c05..b14b45b 100755 --- a/src/aliyunsdk.h +++ b/src/aliyunsdk.h @@ -1,5 +1,6 @@ #pragma once #include "basemodule.h" +#include "oss_c_sdk/oss_api.h" namespace module { /// @@ -9,7 +10,7 @@ namespace module public: aliyun_sdk(); ~aliyun_sdk() override; - + void set(const std::string& access_key_id,const std::string& access_key_secret); diff --git a/target/aliyunoss.lua b/target/aliyunoss.lua new file mode 100644 index 0000000..b693b9b --- /dev/null +++ b/target/aliyunoss.lua @@ -0,0 +1,26 @@ +local aliyun_oss = {} +aliyun_oss.__index = aliyun_oss + +--[[ + 创建一个新的 aliyun_oss 对象 + @return 返回一个新的 aliyun_oss 对象 +]] +function aliyun_oss.new(db) + local instance = setmetatable({}, aliyun_oss) + if db == nil then + instance.module = fw_aliyunoss.new() + else + instance.module = db + end + + return instance +end + +function aliyun_oss:put(endpoint,access_key_id, access_key_secret,bucket_name,object_name,data) + return self.module:put(endpoint,access_key_id, access_key_secret,bucket_name,object_name,data) +end +function aliyun_oss:self() + return self.module:self() +end + +return aliyun_sdk diff --git a/target/aliyunsdk.lua b/target/aliyunsdk.lua index f25f511..ed9fad9 100755 --- a/target/aliyunsdk.lua +++ b/target/aliyunsdk.lua @@ -1,30 +1,30 @@ -local aliyun_sdk = {} -aliyun_sdk.__index = aliyun_sdk - ---[[ - 创建一个新的 fw_aliyun_sdk 对象 - @return 返回一个新的 fw_aliyun_sdk 对象 -]] -function aliyun_sdk.new(db) - local instance = setmetatable({}, aliyun_sdk) - if db == nil then - instance.module = fw_aliyunsdk.new() - else - instance.module = db - end - - return instance -end - -function aliyun_sdk:set(access_key_id, access_key_secret) - return self.module:set(access_key_id, access_key_secret) -end - -function aliyun_sdk:exec(domain, version, parameter) - return self.module:exec(domain, version, parameter) -end -function aliyun_sdk:self() - return self.module:self() -end - -return aliyun_sdk +local aliyun_sdk = {} +aliyun_sdk.__index = aliyun_sdk + +--[[ + 创建一个新的 fw_aliyun_sdk 对象 + @return 返回一个新的 fw_aliyun_sdk 对象 +]] +function aliyun_sdk.new(db) + local instance = setmetatable({}, aliyun_sdk) + if db == nil then + instance.module = fw_aliyunsdk.new() + else + instance.module = db + end + + return instance +end + +function aliyun_sdk:set(access_key_id, access_key_secret) + return self.module:set(access_key_id, access_key_secret) +end + +function aliyun_sdk:exec(domain, version, parameter) + return self.module:exec(domain, version, parameter) +end +function aliyun_sdk:self() + return self.module:self() +end + +return aliyun_sdk