2012-02-26 10 views
2

私はgdk pixbuf画像を処理するCでプログラムされたLinuxアプリを開発しています。そして、ftp(libcurl)を使ってそれらをリモートサーバに送るべきです。画像はgdk_pixbuf_save_to_bufferのgcharバッファに保存されます。gcharバッファ(libcurl)からftpサーバに画像を送る

問題は、このバッファ内のデータを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バッファを取得し、サイズを読み込み、自分のコールバック関数を実行する必要があります

*それからnmembバイトを取り出して* ptrに格納します。

これは私のprevious questionに関連しています。

答えて

2

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); 
} 
+0

グレート、おかげでたくさん! – drwn

+0

libcurlが渡した "size_t size、size_t nmemb"パラメータを制御できますか?ここにシナリオがありますが、2GBのファイルをアップロードしたいのですが、2GBのメモリをバッファに読み込んだり、渡されたファイルポインタからどちらを送信するかをcurlが決めることは望ましくありません。送信中にファイルから読み込む量データを制御したいですか? – heisenberg

関連する問題