gpt4 book ai didi

c - 从 gchar 缓冲区 (libcurl) 向 ftp 服务器发送图像

转载 作者:太空狗 更新时间:2023-10-29 12:20:46 27 4
gpt4 key购买 nike

我正在开发一个用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com