这里只对fdfs_upload_file进行改造,至于其他的也是一样的原理:
在进行fdfs_upload_file的时候,如果是程序中需要实现这个功能,一种方法是使用子进程的逻辑直接调用该程序,这种处理方式需要一个临时文件,而且还需要进程的创建销毁。
另外一种思路是直接参考fdfs_upload_file源码去直接上传文件,fdfs本身就提供了一种直接上传内存缓冲的接口,对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.fastken.com/ for more detail.
**/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "fdfs_client.h"
#include "fdfs_global.h"
#include "fastcommon/base64.h"
#include "fastcommon/sockopt.h"
#include "fastcommon/logger.h"
#include "fdfs_http_shared.h"
#include <unistd.h>/*** @brief * @param  fileName         文件名称* @param  confFileName     client配置路径* @param  fileSize         文件内容大小* @param  buf              文件内容内存缓冲区* @return int */
int fdfs_upload_file(char* fileName, char* confFileName, int fileSize, char* buf)
{char *conf_filename;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];log_init();g_log_context.log_level = LOG_ERR;ignore_signal_pipe();conf_filename = confFileName;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 = fileName;*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\n", \result, STRERROR(result));return result;}const char *file_ext_name = fdfs_get_file_ext_name(local_filename);result = storage_upload_by_filebuff1(pTrackerServer,  \&storageServer, store_path_index, \buf, fileSize, file_ext_name, \NULL, 0, group_name, file_id);// 开始上传文件// result = storage_upload_by_filename1(pTrackerServer, \//      &storageServer, store_path_index, \//       local_filename, NULL, \//       NULL, 0, group_name, file_id);if (result == 0){printf("%s\n", file_id);}else{fprintf(stderr, "upload file fail, " \"error no: %d, error info: %s\n", \result, STRERROR(result));}tracker_close_connection_ex(pTrackerServer, true);fdfs_client_destroy();return result;
}int main(int argc, char *argv[])
{char *fileName = "/home/i/images/p4.jpg";int fd = open(fileName, O_RDONLY);struct stat buf;fstat(fd, &buf);int size = buf.st_size;char *fileContent = malloc(size);read(fd, fileContent, size);close(fd);return fdfs_upload_file(fileName, "/etc/fdfs/client.conf", size, fileContent);
}

fdfs_upload_file发送内存文件相关推荐

  1. (代码篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝

    上一篇讲解了基础文件IO的理论发展,这里结合java看看各项理论的具体实现. 传统IO-intsmaze 传统文件IO操作的基础代码如下: FileInputStream in = new FileI ...

  2. 服务器拒绝发送文件怎么办,服务器拒绝了您发送离线文件

    服务器拒绝了您发送离线文件 内容精选 换一换 夜晚或光线暗区域拍摄的图像存在人眼或机器"看不清"暗光区域的情况.针对此类场景,低光照增强可以将图像的暗光区域增强,使得原来人眼不可见 ...

  3. (理论篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝

    为了快速构建项目,使用高性能框架是我的职责,但若不去深究底层的细节会让我失去对技术的热爱. 探究的过程是痛苦并激动的,痛苦在于完全理解甚至要十天半月甚至没有机会去应用,激动在于技术的相同性,新的框架不 ...

  4. C/C++快速读写磁盘数据的方法-块读取/异步/优化分析算法/内存文件映射的原理和使用

    快速读写磁盘数据的方法: 1.块读取:一下子将数据读取到内存的(无论是文本还是二进制),而不是一行行的读取. 2.异步的IO,创建多线程,或者使用重叠IO,IO复用,异步的事件回调通知机制(可以用事件 ...

  5. 发送临时文件被服务器拒绝,临时会话说服务器拒绝了您发送离线文件的请求 - 卡饭网...

    qq 服务器拒绝了您发送离线文件请求的解决方法 qq 服务器拒绝了您发送离线文件请求的解决方法 qq服务器拒绝了您发送离线文件的原因?在我们日常工作中,因工作需要会用上qq离线文件接收.发送.而前面小 ...

  6. python存文件的模块_python模块之StringIO/cStringIO(内存文件)

    1. StringIO/cStringIO是什么 这个模块提供了一个类,这个类的实例就像是一个文件一样可以读写,实际上读写的是一个字符串缓存,也可以称之为内存文件. StringIO和文件对象拥有共同 ...

  7. QQ邮箱怎么发送文件夹 怎样在QQ邮箱里发送压缩文件夹

    有很多用户想要知道怎么样才能通过QQ邮箱来发送自己的一些文件压缩包,应该怎么操作呢?不要慌,现在小编就给大家分享一下,下面一起来学习操作步骤吧! 其实,无论何种邮箱都无法发送文件夹,都只能对文件进行操 ...

  8. windows7系统做文件服务器拒绝,Win7提示qq服务器拒绝了您发送离线文件

    腾讯QQ功能强大,语音.视频.传输文件等,很多人都喜欢通过qq给朋友或同事发送文件,即使人不在也可以接收离线文件,随时都可以接收.但是有win7用户发送离线文件时提示"服务器拒绝了您发送离线 ...

  9. qt5中服务器文件传输,POST在Qt5中发送JSON文件的请求

    在Qt5的帮助下,通过POST请求将JSON文件发送到服务器时有点问题.我给你一张我的程序:POST在Qt5中发送JSON文件的请求 #include #include #include #inclu ...

  10. 使用GDAL的MEM内存文件保存临时文件

    在使用GDAL编写算法的时候,经常会将计算的中间结果存在一个临时的图像文件中,然后使用完再将其删除,如果临时文件就一个的话,创建一个也无所谓,但是当一个复杂的算法中可能会出现很多个临时文件的时候(我在 ...

最新文章

  1. [FJOI2016]建筑师(斯特林数)
  2. 禁止文字选中 css
  3. Golang之空结构体和零长数组的实践
  4. scalar parameter xxxxx created globally in function xxxx
  5. go 捕获网卡http_接口测试工具Postman(三)使用postman抓包捕获HTTP请求-Go语言中文社区...
  6. 第 132 章 Example
  7. 信息学奥赛一本通 1195:判断整除 | OpenJudge 2.6 3531:判断整除
  8. 多存多取问题 java
  9. Webpack 4.X 从入门到精通 - 第三方库(六)
  10. Python网络编程(2)-粘包现象及socketserver模块实现TCP并发
  11. Win7如何修复开机画面
  12. 文件的HANDLE转化为FILE*!!!
  13. JVM Troubleshooting
  14. Oracle重建控制文件
  15. 载银纳米TiO2/壳聚糖水凝胶/pH/GSH响应羧甲基壳聚糖水凝胶和纳米凝胶的制备
  16. idea的英文是什么意思_intellij是什么意思
  17. 二年级期末计算机基础试题答案,小学二年级语文期末考试卷
  18. 你可以不知道六六,但你必须知道当红电视剧《蜗居》
  19. Windows平台下安装Eclipse插件,开发Hadoop应用
  20. Java --- Xstream使用

热门文章

  1. PHP7.2安装vld扩展
  2. 雨滴win7计算机路径,win7系统设置雨滴桌面(Rainmeter)开机自启动的操作方法
  3. LM2596、LM2576
  4. flash spi w25q128 w25q64 w25q32 w25q16 verilog fpga程序代码
  5. VUE之倒计时插件(超实用)
  6. toastr 使用笔记
  7. 如何学习Java软件开发
  8. wifi 联想小新_联想小新如何开启wifi
  9. git bash批量dos2unix
  10. Lua游戏开发实践指南