当前位置:   article > 正文

c/c++ fast_dfs上传、下载图片

dfs上传

首先安装libfastcommon

1、git clone https://github.com/happyfish100/libfastcommon.git

安装fastdfs

2、cd libfastcommon && ./make.sh && ./make.sh install

3、git clone https://github.com/happyfish100/fastdfs.git

4、cd  fastdfs && ./make.sh && ./make.sh install

在fastdfs/client里面有c操作fastdfs的一些示例文件,这里我用的是fdfs_upload_file.c

到以下就是我的测试工程了,如果你没有fastdfs的服务的话就在安装好fastdfs后 cd /etc/fdfs

sudo cp client.conf.sample client.conf

将base_path=/home/yuqing/fastdfs 改为你机器一个存在的目录,该目录用来存放fastdfs客户端的日志,没有的话可以自己先把目录建好

将tracker_server=192.168.2.33:22122 改为你要访问的地址

sudo cp storage.conf.sample storage.conf

将base_path=/home/yuqing/fastdfs 改为你机器上一个存在的目录,这个目录是用来存放上传的文件的

sudo cp tracker.conf.sample tracker.conf

将base_path=/home/yuqing/fastdfs 改为你机器一个存在的目录,没有的话可以自己先把目录建好

fdfs_trackerd /etc/fdfs/tracker.conf start启动tracker服务

fdfs_storaged /etc/fdfs/storage.conf start启动storage服务

5、下面就是我的测试工程了

  1. #ifndef MY_FDFS_CLIENT_H
  2. #define MY_FDFS_CLIENT_H
  3. #include "fdfs_client.h"
  4. #include "fdfs_global.h"
  5. #include "base64.h"
  6. #include "sockopt.h"
  7. #include "logger.h"
  8. #include <string>
  9. #define TEST
  10. using namespace std;
  11. //错误码
  12. enum FSC_CODE
  13. {
  14. FSC_ERROR_CODE_NONE = 0, //没有错误
  15. FSC_ERROR_CODE_INIT_FAILED, //初始化失败
  16. FSC_ERROR_CODE_PARAM_INVAILD, //参数无效
  17. FSC_ERROR_CODE_CONNECT_TRACKER_FAIL, //连接失败
  18. FSC_ERROR_CODE_QUERY_STORAGE_FAIL, //查询storage地址失败
  19. FSC_ERROR_CODE_CONNECT_STORAGE_FAIL, //连接storage失败
  20. FSC_ERROR_CODE_DOWNLAOD_FILE_FAIL, //下载文件失败
  21. FSC_ERROR_CODE_DELETE_FILE_FAIL, //删除文件失败
  22. };
  23. class CFDFSClient
  24. {
  25. public:
  26. CFDFSClient(void);
  27. ~CFDFSClient(void);
  28. public:
  29. // 初始化客户端
  30. //
  31. //功能:初始化fastdfs
  32. //参数:
  33. // const char* sConfig IN FastDFS配置文件路劲 比如:/etc/fdfs/client.conf
  34. // int nLogLevel 日志等级 采用的是unix 日志等级
  35. // 0: LOG_EMERG
  36. // 1: LOG_ALERT
  37. // 2: LOG_CRIT
  38. // 3: LOG_ERR
  39. // 4: LOG_WARNING
  40. // 5: LOG_NOTICE
  41. // 6: LOG_INFO
  42. // 7: LOG_DEBUG
  43. //返回:int& anError OUT 错误信息
  44. //备注:
  45. // 注意初始化时,必须保证conf文件中base_path目录存在
  46. // 比如 base_path=/fastdfs/tracker, 需要保证/fastdfs/tracker存在,
  47. // 不存在 需创建mkdir /fastdfs/tracker
  48. //
  49. int init(const char* sFDFSConfig, int nLogLevel);
  50. // 下载文件
  51. //
  52. //功能:下载文件
  53. //参数:
  54. // BufferInfo* pBuff OUT 返回的文件信息,文件大小,以及内存大小
  55. // const char *group_name IN 存储组名
  56. // const char* remote_filename IN 存储名
  57. // 比如:group2/M00/00/00/CgEIzVRhnJWAZfVkAAAsFwWtoVg250.png
  58. // group_name:group2
  59. // remote_filename: M00/00/00/CgEIzVRhnJWAZfVkAAAsFwWtoVg250.png
  60. // 返回:0:成功 否则失败。
  61. //
  62. int fdfs_dowloadfile(BufferInfo* pBuff, const char *group_name, const char* remote_filename);
  63. // 上传
  64. //
  65. //功能:上传文件
  66. //参数:
  67. // char *file_content IN 文件内容
  68. // const char *file_ext_name IN 文件扩展名
  69. // int file_size IN 文件大小
  70. // int& name_size OUT 返回的文件名大小
  71. // char* remote_file_name OUT 返回的文件名
  72. // 比如:group2/M00/00/00/CgEIzVRhnJWAZfVkAAAsFwWtoVg250.png
  73. // 返回:0:成功 否则失败。
  74. //
  75. int fdfs_uploadfile( const char *file_content, const char *file_ext_name, int file_size,
  76. int& name_size, char* &remote_file_name);
  77. // slave上传
  78. //
  79. //功能:从文件上传
  80. //参数:
  81. // char *file_content IN 文件内容
  82. // const char *master_filename IN 主文件名 存在服务端文件名
  83. // 比如:M00/00/00/CgEIzVRhnJWAZfVkAAAsFwWtoVg250
  84. // const char *prefix_name IN 从前缀名 比如200*200
  85. // const char *file_ext_name IN 文件扩展名
  86. // int file_size IN 文件大小
  87. // int& name_size OUT 返回的文件名大小
  88. // char* remote_file_name OUT 返回的文件名
  89. // 比如:group2/M00/00/00/CgEIzVRhnJWAZfVkAAAsFwWtoVg250.png
  90. // 返回:0:成功 否则失败。
  91. //
  92. int fdfs_slave_uploadfile( const char *file_content, const char *master_filename,
  93. const char *prefix_name, const char *file_ext_name,
  94. int file_size, int& name_size, char*& remote_file_name );
  95. // 删除
  96. //
  97. //功能:删除文件
  98. //参数:
  99. // const char *group_name IN 存储组名
  100. // const char* remote_filename IN 存储名
  101. // 比如:group2/M00/00/00/CgEIzVRhnJWAZfVkAAAsFwWtoVg250.png
  102. // group_name:group2
  103. // remote_filename: M00/00/00/CgEIzVRhnJWAZfVkAAAsFwWtoVg250.png
  104. // 返回:0:成功 否则失败。
  105. //
  106. int fdfs_deletefile(const char *group_name, const char* remote_filename);
  107. // 所有组信息
  108. //
  109. //功能:获取所有组信息
  110. //参数:
  111. // BufferInfo* group_info OUT 所有组信息
  112. // 返回:0:成功 否则失败。
  113. //
  114. #ifndef TEST
  115. int list_all_groups(BufferInfo* group_info);
  116. // 指定组信息
  117. //
  118. //功能:获取指定组信息
  119. //参数:
  120. // const char* group_name IN 组名 如:group1
  121. // BufferInfo* group_info OUT 所有组信息
  122. // 返回:0:成功 否则失败。
  123. //
  124. int list_one_group(const char* group_name, BufferInfo *group_info);
  125. // storage信息
  126. //
  127. //功能:获取storage信息
  128. //参数:
  129. // const char* group_name IN 组名 如:group1
  130. // const char* storage_id IN 组名 如:storage ip
  131. // BufferInfo* storages_info OUT 存储信息
  132. // 返回:0:成功 否则失败。
  133. //
  134. int list_storages(const char* group_name,
  135. const char* storage_id,
  136. BufferInfo* storages_info);
  137. #endif
  138. private:
  139. void re_fastfds_client_init();
  140. int fastfdfs_client_init(const char* sFDFSConfig);
  141. private:
  142. ConnectionInfo *m_pTrackerServer;
  143. BufferInfo m_RecvBufferInfo;
  144. char* m_pRemoteFileName;
  145. string m_strConfigPath;
  146. int m_nLevelLog;
  147. };
  148. #endif
  1. #include "FDFSClient.h"
  2. #ifndef TEST
  3. #include "json/json.h"
  4. #endif
  5. #define MAX_REMOTE_FILE_NAME_SIZE 100
  6. CFDFSClient::CFDFSClient(void)
  7. {
  8. m_pTrackerServer = NULL;
  9. //m_RecvBufferInfo = {0};
  10. memset(&m_RecvBufferInfo,0,sizeof(m_RecvBufferInfo));
  11. m_pRemoteFileName = NULL;
  12. }
  13. CFDFSClient::~CFDFSClient(void)
  14. {
  15. fdfs_client_destroy();
  16. log_destroy();
  17. if (m_RecvBufferInfo.buff != NULL)
  18. {
  19. free(m_RecvBufferInfo.buff);
  20. }
  21. if (m_pRemoteFileName != NULL)
  22. {
  23. free(m_pRemoteFileName);
  24. }
  25. }
  26. int CFDFSClient::init( const char* sFDFSConfig, int nLogLevel)
  27. {
  28. // 初始化日志
  29. log_init();
  30. g_log_context.log_level = nLogLevel;
  31. m_strConfigPath = sFDFSConfig;
  32. m_nLevelLog = nLogLevel;
  33. // 初始化fastfds客户端
  34. int result = 0;
  35. result = fastfdfs_client_init(sFDFSConfig);
  36. m_pRemoteFileName = (char*)malloc(MAX_REMOTE_FILE_NAME_SIZE * sizeof(char));
  37. memset(m_pRemoteFileName, 0, MAX_REMOTE_FILE_NAME_SIZE - 1);
  38. return result;
  39. }
  40. int CFDFSClient::fastfdfs_client_init(const char* sFDFSConfig)
  41. {
  42. int result = 0;
  43. if ((result=fdfs_client_init(m_strConfigPath.c_str())) != 0)
  44. {
  45. logErrorEx(&g_log_context, "CFDFSClient::init() fdfs_client_init is failed, result:%d", result);
  46. return FSC_ERROR_CODE_INIT_FAILED;
  47. }
  48. return result;
  49. }
  50. int CFDFSClient::fdfs_dowloadfile( BufferInfo* pBuff, const char *group_name, const char* remote_filename)
  51. {
  52. char *file_buff = NULL;
  53. int64_t file_size = 0;
  54. int result = 0;
  55. ConnectionInfo *pTrackerServer = tracker_get_connection();
  56. if (pTrackerServer == NULL)
  57. {
  58. result = (errno != 0 ? errno : ECONNREFUSED);
  59. logErrorEx(&g_log_context, "CFDFSClient::init() tracker_get_connection is failed, result:%d", result);
  60. return FSC_ERROR_CODE_CONNECT_TRACKER_FAIL;
  61. }
  62. // 查询storage 服务地址
  63. ConnectionInfo storageServer;
  64. ConnectionInfo* pStorageServer;
  65. result = tracker_query_storage_fetch(pTrackerServer, \
  66. &storageServer, group_name, remote_filename);
  67. if (result != 0)
  68. {
  69. logErrorEx(&g_log_context, "CFDFSClient::fdfs_dowloadfile() tracker_query_storage_fetch fail, " \
  70. "error no: %d, error info: %s\n", \
  71. result, STRERROR(result));
  72. tracker_disconnect_server_ex(pTrackerServer, true);
  73. return FSC_ERROR_CODE_QUERY_STORAGE_FAIL;
  74. }
  75. logDebugEx(&g_log_context, "CFDFSClient::fdfs_dowloadfile() storage=%s:%d\n", storageServer.ip_addr, \
  76. storageServer.port);
  77. if ((pStorageServer=tracker_connect_server(&storageServer, \
  78. &result)) == NULL)
  79. {
  80. logErrorEx(&g_log_context, "CFDFSClient::fdfs_dowloadfile() \
  81. tracker_connect_server failed, result:%d, storage=%s:%d\n",
  82. result, storageServer.ip_addr, \
  83. storageServer.port);
  84. tracker_disconnect_server_ex(pTrackerServer, true);
  85. return FSC_ERROR_CODE_CONNECT_STORAGE_FAIL;
  86. }
  87. if ((result=storage_download_file_to_buff( \
  88. pTrackerServer, pStorageServer, \
  89. group_name, remote_filename, \
  90. &file_buff, &file_size)) == 0)
  91. {
  92. buffer_memcpy(&m_RecvBufferInfo, file_buff, file_size);
  93. *pBuff = m_RecvBufferInfo;
  94. free(file_buff);
  95. }
  96. if (result != 0)
  97. {
  98. const char* strMsg = STRERROR(result);
  99. logErrorEx(&g_log_context, "CFDFSClient::fdfs_dowloadfile() download file fail, " \
  100. "group:%s, remote;%s, error no: %d, error info: %s\n", \
  101. group_name, remote_filename, result, strMsg);
  102. result = FSC_ERROR_CODE_DOWNLAOD_FILE_FAIL;
  103. }
  104. tracker_disconnect_server_ex(pStorageServer, true);
  105. tracker_disconnect_server_ex(pTrackerServer, true);
  106. return result;
  107. }
  108. int CFDFSClient::fdfs_uploadfile(const char *file_content, const char *file_ext_name, int file_size,
  109. int& name_size, char *&remote_file_name)
  110. {
  111. int result = 0;
  112. ConnectionInfo *pTrackerServer = tracker_get_connection();
  113. if (pTrackerServer == NULL)
  114. {
  115. result = (errno != 0 ? errno : ECONNREFUSED);
  116. logErrorEx(&g_log_context, "CFDFSClient::fdfs_uploadfile() tracker_get_connection is failed, result:%d", result);
  117. return FSC_ERROR_CODE_CONNECT_TRACKER_FAIL;
  118. }
  119. char group_name[FDFS_GROUP_NAME_MAX_LEN + 1];
  120. char remote_filename[256];
  121. int store_path_index;
  122. ConnectionInfo storageServer;
  123. ConnectionInfo* pStorageServer;
  124. if ((result=tracker_query_storage_store(pTrackerServer, \
  125. &storageServer, group_name, &store_path_index)) != 0)
  126. {
  127. tracker_disconnect_server_ex(pTrackerServer, true);
  128. logErrorEx(&g_log_context, "tracker_query_storage fail, " \
  129. "error no: %d, error info: %s\n", \
  130. result, STRERROR(result));
  131. return result;
  132. }
  133. if ((pStorageServer=tracker_connect_server(&storageServer, \
  134. &result)) == NULL)
  135. {
  136. logErrorEx(&g_log_context, "CFDFSClient::fdfs_uploadfile() \
  137. tracker_connect_server failed, result:%d, storage=%s:%d\n",
  138. result, storageServer.ip_addr, \
  139. storageServer.port);
  140. tracker_disconnect_server_ex(pTrackerServer, true);
  141. return result;
  142. }
  143. result = storage_upload_by_filebuff(pTrackerServer, \
  144. pStorageServer, store_path_index, \
  145. file_content, file_size, file_ext_name, \
  146. NULL, 0, \
  147. group_name, remote_filename);
  148. if (result != 0)
  149. {
  150. const char* strMsg = STRERROR(result);
  151. logErrorEx(&g_log_context, "CFDFSClient::fdfs_uploadfile() upload file fail, " \
  152. "group:%s, remote;%s, error no: %d, error info: %s\n", \
  153. group_name, remote_filename, result, strMsg);
  154. }
  155. else{
  156. int nNameSize = snprintf(m_pRemoteFileName,MAX_REMOTE_FILE_NAME_SIZE-1, "%s/%s", group_name, remote_filename);
  157. remote_file_name = m_pRemoteFileName;
  158. name_size = nNameSize;
  159. }
  160. tracker_disconnect_server_ex(pStorageServer, true);
  161. tracker_disconnect_server_ex(pTrackerServer, true);
  162. return result;
  163. }
  164. int CFDFSClient::fdfs_slave_uploadfile( const char *file_content, const char *master_filename,
  165. const char *prefix_name, const char *file_ext_name,
  166. int file_size, int& name_size, char*& remote_file_name)
  167. {
  168. int result = 0;
  169. ConnectionInfo *pTrackerServer = tracker_get_connection();
  170. if (pTrackerServer == NULL)
  171. {
  172. result = (errno != 0 ? errno : ECONNREFUSED);
  173. logErrorEx(&g_log_context, "CFDFSClient::fdfs_slave_uploadfile() tracker_get_connection is failed, result:%d", result);
  174. return FSC_ERROR_CODE_CONNECT_TRACKER_FAIL;
  175. }
  176. char group_name[FDFS_GROUP_NAME_MAX_LEN + 1];
  177. char remote_filename[256];
  178. int store_path_index;
  179. ConnectionInfo storageServer;
  180. ConnectionInfo* pStorageServer;
  181. if ((result=tracker_query_storage_store(pTrackerServer, \
  182. &storageServer, group_name, &store_path_index)) != 0)
  183. {
  184. tracker_disconnect_server_ex(pTrackerServer, true);
  185. logErrorEx(&g_log_context, "tracker_query_storage fail, " \
  186. "error no: %d, error info: %s\n", \
  187. result, STRERROR(result));
  188. return result;
  189. }
  190. if ((pStorageServer=tracker_connect_server(&storageServer, \
  191. &result)) == NULL)
  192. {
  193. logErrorEx(&g_log_context, "CFDFSClient::fdfs_slave_uploadfile() \
  194. tracker_connect_server failed, result:%d, storage=%s:%d\n",
  195. result, storageServer.ip_addr, \
  196. storageServer.port);
  197. tracker_disconnect_server_ex(pTrackerServer, true);
  198. return result;
  199. }
  200. result = storage_upload_slave_by_filebuff(pTrackerServer, \
  201. pStorageServer, file_content, file_size, \
  202. master_filename, prefix_name, file_ext_name, \
  203. NULL, 0, \
  204. group_name, remote_filename);
  205. //logErrorEx(&g_log_context, "master_filename:%s, prefix_name:%s, file_ext_name:%s, group_name:%s, remote_filename:%s\n",
  206. // master_filename, prefix_name, file_ext_name, group_name, remote_filename);
  207. if (result != 0)
  208. {
  209. const char* strMsg = STRERROR(result);
  210. logErrorEx(&g_log_context, "CFDFSClient::fdfs_slave_uploadfile() upload file fail, " \
  211. "group:%s, remote;%s, error no: %d, error info: %s\n", \
  212. group_name, remote_filename, result, strMsg);
  213. }
  214. else{
  215. int nNameSize = snprintf(m_pRemoteFileName,MAX_REMOTE_FILE_NAME_SIZE-1, "%s/%s", group_name, remote_filename);
  216. remote_file_name = m_pRemoteFileName;
  217. name_size = nNameSize;
  218. }
  219. tracker_disconnect_server_ex(pStorageServer, true);
  220. tracker_disconnect_server_ex(pTrackerServer, true);
  221. return result;
  222. }
  223. int CFDFSClient::fdfs_deletefile( const char *group_name, const char* remote_filename )
  224. {
  225. int result = 0;
  226. ConnectionInfo *pTrackerServer = tracker_get_connection();
  227. if (pTrackerServer == NULL)
  228. {
  229. fdfs_client_destroy();
  230. result = (errno != 0 ? errno : ECONNREFUSED);
  231. logErrorEx(&g_log_context, "CFDFSClient::init() tracker_get_connection is failed, result:%d", result);
  232. return FSC_ERROR_CODE_CONNECT_TRACKER_FAIL;
  233. }
  234. // 查询storage 服务地址
  235. ConnectionInfo storageServer;
  236. ConnectionInfo* pStorageServer;
  237. result = tracker_query_storage_update(pTrackerServer, \
  238. &storageServer, group_name, remote_filename);
  239. if (result != 0)
  240. {
  241. logErrorEx(&g_log_context, "CFDFSClient::fdfs_deletefile() tracker_query_storage_fetch fail, " \
  242. "error no: %d, error info: %s\n", \
  243. result, STRERROR(result));
  244. tracker_disconnect_server_ex(pTrackerServer, true);
  245. return FSC_ERROR_CODE_QUERY_STORAGE_FAIL;
  246. }
  247. logDebugEx(&g_log_context, "CFDFSClient::fdfs_deletefile() storage=%s:%d\n", storageServer.ip_addr, \
  248. storageServer.port);
  249. if ((pStorageServer=tracker_connect_server(&storageServer, \
  250. &result)) == NULL)
  251. {
  252. logErrorEx(&g_log_context, "CFDFSClient::fdfs_deletefile() \
  253. tracker_connect_server failed, result:%d, storage=%s:%d\n",
  254. result, storageServer.ip_addr, \
  255. storageServer.port);
  256. tracker_disconnect_server_ex(pTrackerServer, true);
  257. return FSC_ERROR_CODE_CONNECT_STORAGE_FAIL;
  258. }
  259. // 删除操作
  260. result=storage_delete_file(pTrackerServer, NULL, group_name, remote_filename);
  261. if (result != 0)
  262. {
  263. const char* strMsg = STRERROR(result);
  264. logErrorEx(&g_log_context, "CFDFSClient::fdfs_deletefile() delete file fail, " \
  265. "group:%s, remote;%s, error no: %d, error info: %s\n", \
  266. group_name, remote_filename, result, strMsg);
  267. result = FSC_ERROR_CODE_DELETE_FILE_FAIL;
  268. }
  269. tracker_disconnect_server_ex(pStorageServer, true);
  270. tracker_disconnect_server_ex(pTrackerServer, true);
  271. return result;
  272. }
  273. #ifndef TEST
  274. int CFDFSClient::list_all_groups(BufferInfo* group_info)
  275. {
  276. int result = 0;
  277. ConnectionInfo *pTrackerServer = tracker_get_connection();
  278. if (pTrackerServer == NULL)
  279. {
  280. fdfs_client_destroy();
  281. result = (errno != 0 ? errno : ECONNREFUSED);
  282. logErrorEx(&g_log_context, "CFDFSClient::init() tracker_get_connection is failed, result:%d", result);
  283. return FSC_ERROR_CODE_CONNECT_TRACKER_FAIL;
  284. }
  285. int group_count;
  286. FDFSGroupStat group_stats[FDFS_MAX_GROUPS];
  287. result = tracker_list_groups(pTrackerServer, \
  288. group_stats, FDFS_MAX_GROUPS, \
  289. &group_count);
  290. if (result != 0)
  291. {
  292. tracker_disconnect_server_ex(pTrackerServer, true);
  293. const char* strMsg = STRERROR(result);
  294. logErrorEx(&g_log_context, "CFDFSClient::list_all_groups() get list_all_groups fail, " \
  295. "error no: %d, error info: %s\n", \
  296. result, strMsg);
  297. return result;
  298. }
  299. Json::Value GroupsValue;
  300. Json::Value Info;
  301. FDFSGroupStat *pGroupStat;
  302. FDFSGroupStat *pGroupEnd;
  303. pGroupEnd = group_stats + group_count;
  304. for (pGroupStat=group_stats; pGroupStat<pGroupEnd; \
  305. pGroupStat++)
  306. {
  307. Info["group_name"] = pGroupStat->group_name;
  308. Info["total_mb"] = (long long)pGroupStat->total_mb;
  309. Info["free_mb"] = (long long)pGroupStat->free_mb;
  310. Info["trunk_free_mb"] = (long long)pGroupStat->trunk_free_mb;
  311. Info["server_count"] = pGroupStat->count;
  312. Info["storage_port"] = pGroupStat->storage_port;
  313. Info["active_count"] = pGroupStat->active_count;
  314. Info["current_write_server"] = pGroupStat->current_write_server;
  315. Info["subdir_count_per_path"] = pGroupStat->subdir_count_per_path;
  316. Info["current_trunk_file_id"] = pGroupStat->current_trunk_file_id;
  317. GroupsValue.append(Info);
  318. }
  319. std::string strGroupsInfo = GroupsValue.toStyledString();
  320. buffer_memcpy(&m_RecvBufferInfo, strGroupsInfo.c_str(), strGroupsInfo.length());
  321. *group_info = m_RecvBufferInfo;
  322. tracker_disconnect_server_ex(pTrackerServer, true);
  323. return result;
  324. }
  325. int CFDFSClient::list_one_group(const char* group_name, BufferInfo* group_info)
  326. {
  327. int result;
  328. FDFSGroupStat group_stat;
  329. ConnectionInfo *pTrackerServer = tracker_get_connection();
  330. if (pTrackerServer == NULL)
  331. {
  332. fdfs_client_destroy();
  333. result = (errno != 0 ? errno : ECONNREFUSED);
  334. logErrorEx(&g_log_context, "CFDFSClient::init() tracker_get_connection is failed, result:%d", result);
  335. return FSC_ERROR_CODE_CONNECT_TRACKER_FAIL;
  336. }
  337. result = tracker_list_one_group(pTrackerServer, group_name, &group_stat);
  338. if (result != 0)
  339. {
  340. tracker_disconnect_server_ex(pTrackerServer, true);
  341. const char* strMsg = STRERROR(result);
  342. logErrorEx(&g_log_context, "CFDFSClient::list_one_group() get list_one_group fail, " \
  343. "error no: %d, error info: %s\n", \
  344. result, strMsg);
  345. return result;
  346. }
  347. Json::Value GroupsValue;
  348. GroupsValue["group_name"] = group_stat.group_name;
  349. GroupsValue["total_mb"] = (long long)group_stat.total_mb;
  350. GroupsValue["free_mb"] = (long long)group_stat.free_mb;
  351. GroupsValue["trunk_free_mb"] = (long long)group_stat.trunk_free_mb;
  352. GroupsValue["server_count"] = group_stat.count;
  353. GroupsValue["storage_port"] = group_stat.storage_port;
  354. GroupsValue["active_count"] = group_stat.active_count;
  355. GroupsValue["current_write_server"] = group_stat.current_write_server;
  356. GroupsValue["subdir_count_per_path"] = group_stat.subdir_count_per_path;
  357. GroupsValue["current_trunk_file_id"] = group_stat.current_trunk_file_id;
  358. std::string strGroupsInfo = GroupsValue.toStyledString();
  359. buffer_memcpy(&m_RecvBufferInfo, strGroupsInfo.c_str(), strGroupsInfo.length());
  360. *group_info = m_RecvBufferInfo;
  361. tracker_disconnect_server_ex(pTrackerServer, true);
  362. return result;
  363. }
  364. int CFDFSClient::list_storages(const char* group_name,
  365. const char* storage_id,
  366. BufferInfo* storages_info)
  367. {
  368. int result;
  369. int storage_count;
  370. FDFSStorageInfo storage_infos[FDFS_MAX_SERVERS_EACH_GROUP];
  371. FDFSStorageInfo *pStorage;
  372. FDFSStorageInfo *pStorageEnd;
  373. FDFSStorageStat *pStorageStat;
  374. ConnectionInfo *pTrackerServer = tracker_get_connection();
  375. if (pTrackerServer == NULL)
  376. {
  377. fdfs_client_destroy();
  378. result = (errno != 0 ? errno : ECONNREFUSED);
  379. logErrorEx(&g_log_context, "CFDFSClient::init() tracker_get_connection is failed, result:%d", result);
  380. return FSC_ERROR_CODE_CONNECT_TRACKER_FAIL;
  381. }
  382. result = tracker_list_servers(pTrackerServer, \
  383. group_name, storage_id, \
  384. storage_infos, FDFS_MAX_SERVERS_EACH_GROUP, \
  385. &storage_count);
  386. if (result != 0)
  387. {
  388. tracker_disconnect_server_ex(pTrackerServer, true);
  389. const char* strMsg = STRERROR(result);
  390. logErrorEx(&g_log_context, "CFDFSClient::list_storages() get list_storages fail, " \
  391. "error no: %d, error info: %s\n", \
  392. result, strMsg);
  393. return result;
  394. }
  395. Json::Value StoragesValue;
  396. Json::Value Info;
  397. char szJoinTime[32];
  398. char szUpTime[32];
  399. char szLastHeartBeatTime[32];
  400. char szSrcUpdTime[32];
  401. char szSyncUpdTime[32];
  402. char szSyncedTimestamp[32];
  403. pStorageEnd = storage_infos + storage_count;
  404. for (pStorage=storage_infos; pStorage<pStorageEnd; \
  405. pStorage++)
  406. {
  407. Info["status"] = pStorage->status;
  408. Info["id"] = pStorage->id;
  409. Info["ip_addr"] = pStorage->ip_addr;
  410. Info["version"] = pStorage->version;
  411. Info["src_id"] = pStorage->src_id;
  412. Info["domain_name"] = pStorage->domain_name;
  413. Info["total_mb"] = pStorage->total_mb;
  414. Info["free_mb"] = pStorage->free_mb;
  415. Info["upload_priority"] = pStorage->upload_priority;
  416. formatDatetime(pStorage->join_time, \
  417. "%Y-%m-%d %H:%M:%S", \
  418. szJoinTime, sizeof(szJoinTime)), \
  419. Info["join_time"] = szJoinTime;
  420. formatDatetime(pStorage->up_time, \
  421. "%Y-%m-%d %H:%M:%S", \
  422. szUpTime, sizeof(szUpTime)), \
  423. Info["up_time"] = szUpTime;
  424. Info["store_path_count"] = pStorage->store_path_count;
  425. Info["subdir_count_per_path"] = pStorage->subdir_count_per_path;
  426. Info["storage_port"] = pStorage->storage_port;
  427. Info["current_write_path"] = pStorage->current_write_path;
  428. // 统计数据
  429. pStorageStat = &(pStorage->stat);
  430. Info["total_upload_count"] = (long long)pStorageStat->total_upload_count;
  431. Info["success_upload_count"] = (long long)pStorageStat->success_upload_count;
  432. Info["total_delete_count"] = (long long)pStorageStat->total_delete_count;
  433. Info["success_delete_count"] = (long long)pStorageStat->success_delete_count;
  434. Info["total_download_count"] = (long long)pStorageStat->total_download_count;
  435. Info["success_download_count"] = (long long)pStorageStat->success_download_count;
  436. Info["total_upload_bytes"] = (long long)pStorageStat->total_upload_bytes;
  437. Info["success_upload_bytes"] = (long long)pStorageStat->success_upload_bytes;
  438. Info["total_download_bytes"] = (long long)pStorageStat->total_download_bytes;
  439. Info["success_download_bytes"] = (long long)pStorageStat->success_download_bytes;
  440. Info["total_sync_in_bytes"] = (long long)pStorageStat->total_sync_in_bytes;
  441. Info["success_sync_in_bytes"] = (long long)pStorageStat->success_sync_in_bytes;
  442. Info["total_sync_out_bytes"] = (long long)pStorageStat->total_sync_out_bytes;
  443. Info["success_sync_out_bytes"] = (long long)pStorageStat->success_sync_out_bytes;
  444. Info["total_file_open_count"] = (long long)pStorageStat->total_file_open_count;
  445. Info["success_file_open_count"] = (long long)pStorageStat->success_file_open_count;
  446. Info["total_file_read_count"] = (long long)pStorageStat->total_file_read_count;
  447. Info["success_file_read_count"] = (long long)pStorageStat->success_file_read_count;
  448. Info["total_file_write_count"] = (long long)pStorageStat->total_file_write_count;
  449. Info["success_file_write_count"] =(long long) pStorageStat->success_file_write_count;
  450. formatDatetime(pStorageStat->last_heart_beat_time, \
  451. "%Y-%m-%d %H:%M:%S", \
  452. szLastHeartBeatTime, sizeof(szLastHeartBeatTime)), \
  453. Info["last_heart_beat_time"] = szLastHeartBeatTime;
  454. formatDatetime(pStorageStat->last_source_update, \
  455. "%Y-%m-%d %H:%M:%S", \
  456. szSrcUpdTime, sizeof(szSrcUpdTime)), \
  457. Info["last_source_update"] = szSrcUpdTime;
  458. formatDatetime(pStorageStat->last_sync_update, \
  459. "%Y-%m-%d %H:%M:%S", \
  460. szSyncUpdTime, sizeof(szSyncUpdTime)), \
  461. Info["last_sync_update"] = szSyncUpdTime;
  462. formatDatetime(pStorageStat->last_synced_timestamp, \
  463. "%Y-%m-%d %H:%M:%S", \
  464. szSyncedTimestamp, sizeof(szSyncedTimestamp));
  465. Info["last_synced_timestamp"] = szSyncedTimestamp;
  466. StoragesValue.append(Info);
  467. }
  468. std::string strStorageInfo = StoragesValue.toStyledString();
  469. buffer_memcpy(&m_RecvBufferInfo, strStorageInfo.c_str(), strStorageInfo.length());
  470. *storages_info = m_RecvBufferInfo;
  471. tracker_disconnect_server_ex(pTrackerServer, true);
  472. return result;
  473. }
  474. #endif
  1. #include <iostream>
  2. #include <fstream>
  3. #include <memory>
  4. #include "FDFSClient.h"
  5. void ShowError(const std::string &msg, int code){
  6. if(code == 0) return;
  7. std::cout << msg << ":" << code << std::endl;
  8. ::exit(-1);
  9. }
  10. int main()
  11. {
  12. std::ifstream file_stream("desktop_test.png", std::ios::in | std::ios::binary);
  13. file_stream.seekg(0, std::ios_base::end);
  14. int file_size = file_stream.tellg();
  15. file_stream.seekg(0, std::ios_base::beg);
  16. std::shared_ptr<char> buffer(new char[file_size]);
  17. file_stream.read(buffer.get(), file_size);
  18. char *remote_file_name = nullptr;
  19. int remote_name_size = 0;
  20. CFDFSClient fdfs_client;
  21. ShowError("client_init", fdfs_client.init("client.conf",6));
  22. ShowError("upload_file",fdfs_client.fdfs_uploadfile(buffer.get(),"png", file_size, remote_name_size, remote_file_name));
  23. std::cout << "remote file name: " << remote_file_name << std::endl;
  24. return 0;
  25. }

 cmake配置如下

  1. cmake_minimum_required(VERSION 2.8)
  2. project(fdfs_client)
  3. add_compile_options(-std=c++17 -fpermissive)
  4. INCLUDE_DIRECTORIES(/usr/include/fastcommon /usr/include/fastdfs)
  5. LINK_DIRECTORIES(/home/whl/Documents/qtproject/fdfs_client/json/lib)
  6. find_package(spdlog REQUIRED)
  7. aux_source_directory(. Client_Sources)
  8. add_executable(${PROJECT_NAME} ${Client_Sources})
  9. target_link_libraries(${PROJECT_NAME} spdlog::spdlog_header_only fdfsclient fastcommon)

有个json编译没过,我将它注释了,影响不大。如果上传成功,就会返回一个这样的地址

group1/M00/29/6A/wKgCKF0YUmKAVdsAAAm9c5z7Go4983.png

在浏览器中就可以访问了(需要配置nginx)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/745249
推荐阅读
相关标签
  

闽ICP备14008679号