read_callback()
は、サーバーにアップロードされるデータを取得する必要があるときにCURLが呼び出す関数です。 read_callback()
がのようなものであると想像してください。〜fread()
呼び出されると、それは必要なブードームンボジャンボを実行しますが、最終的にアップロード可能なデータはcurlの内部バッファーである*ptr
バッファーに格納されなければなりません。あなたのインメモリバッファーのためにmemcpy()
はread_callback()
の本体としてちょうどいいでしょうから、実際にはfread()
は必要ありません。
size * nmemb
は、1つのデータチャンクに対してどのくらいの大きさのバッファcurlが予約されているかを示します。最後の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);
}
グレート、おかげでたくさん! – drwn
libcurlが渡した "size_t size、size_t nmemb"パラメータを制御できますか?ここにシナリオがありますが、2GBのファイルをアップロードしたいのですが、2GBのメモリをバッファに読み込んだり、渡されたファイルポインタからどちらを送信するかをcurlが決めることは望ましくありません。送信中にファイルから読み込む量データを制御したいですか? – heisenberg