FastDFSファイルアップロードテスト

5632 ワード

FastDFSはオープンソースの分散型ストレージフレームワークで、主に3つの部分から構成されています.client、tracker、storageです.具体的な関連アーキテクチャと紹介は関連ブログを参照してください.ファイルのアップロード操作はFastDFSのソースコードの中のclientを実現して、名前はfdfs_と言いますupload_file.c
/**
* Copyright (C) 2008 Happy Fish / YuQing
*
* FastDFS may be copied only under the terms of the GNU General
* Public License V3, which may be found in the FastDFS source kit.
* Please visit the FastDFS Home Page http://www.csource.org/ for more detail.
**/

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "fdfs_client.h"
#include "fastcommon/logger.h"

static void usage(char *argv[])
{
	printf("Usage: %s   " \
		"[storage_ip:port] [store_path_index]
", argv[0]); } int main(int argc, char *argv[]) { char *conf_filename;//client char *local_filename;// char group_name[FDFS_GROUP_NAME_MAX_LEN + 1]; ConnectionInfo *pTrackerServer;// int result; int store_path_index; ConnectionInfo storageServer; char file_id[128]; if (argc < 3) { usage(argv); return 1; } log_init(); g_log_context.log_level = LOG_ERR; ignore_signal_pipe(); conf_filename = argv[1]; // if ((result=fdfs_client_init(conf_filename)) != 0) { return result; } // , pTrackerServer = tracker_get_connection(); if (pTrackerServer == NULL) { fdfs_client_destroy(); return errno != 0 ? errno : ECONNREFUSED; } local_filename = argv[2]; *group_name = '\0'; if (argc >= 4) { const char *pPort; const char *pIpAndPort; pIpAndPort = argv[3]; pPort = strchr(pIpAndPort, ':'); if (pPort == NULL) { fdfs_client_destroy(); fprintf(stderr, "invalid storage ip address and " \ "port: %s
", pIpAndPort); usage(argv); return 1; } storageServer.sock = -1; snprintf(storageServer.ip_addr, sizeof(storageServer.ip_addr), \ "%.*s", (int)(pPort - pIpAndPort), pIpAndPort); storageServer.port = atoi(pPort + 1); if (argc >= 5) { store_path_index = atoi(argv[4]); } else { store_path_index = -1; } } // else if ((result=tracker_query_storage_store(pTrackerServer, \ &storageServer, group_name, &store_path_index)) != 0) { fdfs_client_destroy(); fprintf(stderr, "tracker_query_storage fail, " \ "error no: %d, error info: %s
", \ result, STRERROR(result)); return result; } // result = storage_upload_by_filename1(pTrackerServer, \ &storageServer, store_path_index, \ local_filename, NULL, \ NULL, 0, group_name, file_id); if (result == 0) { printf("%s
", file_id); } else { fprintf(stderr, "upload file fail, " \ "error no: %d, error info: %s
", \ result, STRERROR(result)); } tracker_disconnect_server_ex(pTrackerServer, true); fdfs_client_destroy(); return result; }

以上はソースコードであるが、以下は主にソースコードを利用して、私たち自身のファイルアップロードの小さなDemoの例を実現する.fdfs_upload_file.c実装
//filename         
//myfile        
int fdfs_upload_file(const char* filename, const char* myfile, char* file_id)
{
	char group_name[FDFS_GROUP_NAME_MAX_LEN + 1];
	ConnectionInfo *pTrackerServer;
	int result;
	int store_path_index;
	ConnectionInfo storageServer;
	if ((result=fdfs_client_init(filename)) != 0)
	{
		return result;
	}
	pTrackerServer = tracker_get_connection();
	if (pTrackerServer == NULL)
	{
		fdfs_client_destroy();
		return errno != 0 ? errno : ECONNREFUSED;
	}
	*group_name = '\0';
	if ((result=tracker_query_storage_store(pTrackerServer, \
	                &storageServer, group_name, &store_path_index)) != 0)
	{
		fdfs_client_destroy();
		fprintf(stderr, "tracker_query_storage fail, " \
			"error no: %d, error info: %s
", \ result, STRERROR(result)); return result; } result = storage_upload_by_filename1(pTrackerServer, \ &storageServer, store_path_index, \ myfile, NULL, \ NULL, 0, group_name, file_id); if (result == 0) { printf("%s
", file_id); } else { fprintf(stderr, "upload file fail, " \ "error no: %d, error info: %s
", \ result, STRERROR(result)); } tracker_disconnect_server_ex(pTrackerServer, true); fdfs_client_destroy(); return result; }

関連ヘッダファイルfdfs_api.h
#ifndef _FDFS_API_H//     ,      
#define _FDFS_API_H
int fdfs_upload_file(const char* conf_file, const char* myfile, char* file_id);
#endif


メインファイルc
#include
#include
#include
#include"fdfs_api.h"
int main(int args , char* argv[]){
	char fileid[1024] = {0};
	fdfs_upload_file("/etc/fdfs/client.conf",argv[1],fileid);
	printf("fileid = %s
",fileid); return 0; }

次に、コマンドラインでgccコンパイルを使用して実行可能ファイルを取得します.コンパイル中に、コンパイラは関連するヘッダファイルと動的リンクライブラリが欠けていることを示します.
gcc fdfs_api.c main.c -I /usr/include/fastdfs/ -I /usr/include/fastcommon/ -lfdfsclient -o main

ここで生成された実行可能ファイルはmainであり、mainを実行します.
./main main.c


ここでmain.cファイルアップロード.最後に出力情報を得る.
group1/M00/00/00/wKizgFyM_5uALngQAAAA8yoERFY67844.c
fileid = group1/M00/00/00/wKizgFyM_5uALngQAAAA8yoERFY67844.c

ここでgroup 1はプロファイルに設定されており、M 00はアドレスマッピング、つまり自分がプロファイルに設定したストレージパスである.道は果てしなく広がっていて、私は上下して求めます.自分で自分に腹を立てる.