- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个用 C 编写的 linux 应用程序,它处理 gdk pixbuf 图像,然后应该通过 ftp (libcurl) 将它们发送到远程服务器。图像被保存到一个 gchar 缓冲区中 gdk_pixbuf_save_to_buffer .
问题是我不知道如何将此缓冲区中的数据与 libcurl read callback function 结合使用将图像正确发送到远程服务器。到目前为止,我所有的尝试都在生成的文件中生成了随机字节。
有一个 libcurl 读取回调函数的示例,如下所示:
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
size_t retcode = fread(ptr, size, nmemb, stream);
return retcode;
}
我需要做我自己的回调函数,将 gchar 缓冲区而不是文件流作为输入,并从中读取 size*nmemb 字节并将其存储到 *ptr。
这与我的previous question有关.
最佳答案
read_callback()
是 CURL 在需要获取要上传到服务器的数据时调用的函数。假设 read_callback()
与 fread()
类似。当被调用时,它会执行任何需要的巫术巨型,但最终可上传的数据必须存储在 *ptr
缓冲区中,这是 curl 的内部缓冲区。对于您的内存缓冲区 memcpy()
将作为 read_callback()
的主体正常工作,因此您不需要真正的 fread()
完全没有。
size * nmemb
告诉您 curl 为单个数据 block 保留了多大的缓冲区。最后一个 void*
是一个由 CURLOPT_READDATA 选项设置的指针——它是一种随心所欲的指针,因此它可以指向一个包含数据的结构您正在上传和一些附加信息,例如目前的进展。
您可以将其用作示例:
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <stdlib.h>
#include <curl/curl.h>
#include <string.h>
struct transfer
{
gchar *buf;
gsize total;
size_t uploaded;
};
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *data)
{
struct transfer * tr = data;
size_t left = tr->total - tr->uploaded;
size_t max_chunk = size * nmemb;
size_t retcode = left < max_chunk ? left : max_chunk;
memcpy(ptr, tr->buf + tr->uploaded, retcode); // <-- voodoo-mumbo-jumbo :-)
tr->uploaded += retcode; // <-- save progress
return retcode;
}
int main()
{
GdkPixbuf * gbuffer = NULL;
GError * error = NULL;
gchar * buffer;
gsize size;
g_type_init();
gbuffer = gdk_pixbuf_new_from_file("g.png", &error);
gdk_pixbuf_save_to_buffer(gbuffer, &buffer, &size, "jpeg", &error, NULL);
struct transfer tr = {buffer, size, 0};
CURL *easyhandle = curl_easy_init();
curl_easy_setopt(easyhandle, CURLOPT_READFUNCTION, read_callback);
curl_easy_setopt(easyhandle, CURLOPT_READDATA, &tr); // <-- this will be *data in read_callback()
curl_easy_setopt(easyhandle, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(easyhandle, CURLOPT_URL, "http://example.com/upload.php");
CURLcode rc = curl_easy_perform(easyhandle);
}
关于c - 从 gchar 缓冲区 (libcurl) 向 ftp 服务器发送图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9453996/
我使用以下代码比较 gchar 中的字符串存储与从文件中读取的 char 数组: while (fgets(line, sizeof line, config) != NULL) { pr
我有一个包含字符串的字符数组: char buf[MAXBUFLEN]; buf[0] = 'f'; buf[1] = 'o'; buf[2] = 'o'; buf[3] = '\0'; 我希望将此字
所以,事情就是这样,我在这个上使用 GTK。 我正在请求 set_entry_text 上的名称。因此,用户输入他的名字,我将该变量保存为字符。 char *jugador1, *jugador2 /
我正在使用 g_strsplit 使用 \n 分隔符拆分 msg,并创建一个函数来断开字符串。该函数会中断 msg 并返回调用函数,因此我无法释放被调用函数中的拆分字符串指针。因此试图通过引用传递 g
当我尝试运行以下代码片段时,我不断收到此错误和奇怪的乱码: 错误是: (foo:11333):Pango-WARNING **:传递给 pango_layout_set_text() 的 UTF-8
当我按下键盘上的某个键(整数)时。它的作用类似于: gchar *keypressed; keypressed=gdk_keyval_name (event->keyval); printf("
我有一个定义如下的函数(用 C 语言): gchar **Scan_Return_File_Tag_Field_From_Mask_Code (File_Tag *FileTag, gchar cod
我似乎无法弄清楚我在这里做错了什么 我的结构: struct listItem {const gchar *name,*val1,*val2,*val3;}; 然后我会这样做: listItem *t
我正在尝试通过这段代码将 gchar 转换为 char const gchar * AddressText ; char * AddressValue = (char *) AddressText ;
我是初学者,使用 GTK+ 和 C 来编写一个小应用程序。我正在为 GtkTreeView 设置一个过滤器,显示功能如下,主要是从 here 复制的. static gboolean filter_f
我试图重构/修复一个函数,我是否正确地进行了截断?如果不是,一般应该怎么做?特别想知道潜在的泄漏。 void process_entry(GMenuTreeEntry *entry) { ch
在我的应用程序中我有结构: struct { gchar *xen_srv_addr; gchar *xen_srv_usr; gchar *xen_srv_psw; gchar *x
我目前正在学习 GTKTextTags和申请 GtkTextView和 GtkTextBuffer .我确实注意到了this question但不打算将我的数据导出到富文本文件,我认为这是问题的主要目
我有以下代码: int main() { const gchar *wew = gtk_entry_get_text(GTK_ENTRY(gtkentrywidget)); return 0; } g
在我的 main.h(包含在所有其他 src 文件中)中,我有: char* buffer; 这可以编译并正常工作。 由于某些其他原因,我尝试初始化buffer,两者都是 char* buffer="
我有一个字符串,其中包含一个整数值(的数字),我想以 int 形式获取该值。我知道还有其他方法可以做到这一点,例如 atoi();但是,我真的很想使用 glib 来做到这一点。是否存在这样的解析/转换
我正在开发一个用 C 编写的 linux 应用程序,它处理 gdk pixbuf 图像,然后应该通过 ftp (libcurl) 将它们发送到远程服务器。图像被保存到一个 gchar 缓冲区中 gdk
我正在为 gstreamer 构建一个 node.js 包装器。我能够构建和提取大量信息和对象(例如版本、插件、功能、上限和元素工厂。) 但是,当我调用 gst_element_factory_mak
我是一名优秀的程序员,十分优秀!