2016-05-28 17 views
0

私はlibcurlを使用しているので、ポストリクエストでhttpサーバにファイルをアップロードします。以下libcurlでPOSTリクエストを使用してhttpサーバにファイルをアップロードする

static int copy_to_http_server(char *src, char *disp_src, char srcflag, 
           char *dst, char *disp_dst, char dstflag) 
{ 
    CURL *curl; 
    CURLcode res; 
    char *url = disp_dst; 
    char *outfilename = src; 

    struct curl_httppost *formpost=NULL; 
    struct curl_httppost *lastptr=NULL; 
    struct curl_slist *headerlist=NULL; 
    static const char buf[] = "Expect:"; 

    /* src = /users/play/team.jpg 
    * url = http://10.1.2.3/repo/team_server.jpg 
    * i want 'src' to be copied under 'repo' directory on http server and 
    * the file name on the server should be team_server.jpg or team.jpg is 
    * also fine */ 

    curl_global_init(CURL_GLOBAL_ALL); 

    /* Fill in the file upload field */ 
    curl_formadd(&formpost, 
       &lastptr, 
       CURLFORM_COPYNAME, "sendfile", 
       CURLFORM_FILE, src, 
       CURLFORM_END); 

    /* Fill in the filename field */ 
    curl_formadd(&formpost, 
       &lastptr, 
       CURLFORM_COPYNAME, "filename", 
       CURLFORM_COPYCONTENTS, src, 
       CURLFORM_END); 
    /* Fill in the submit field too, even if this is rarely needed */ 
    curl_formadd(&formpost, 
      &lastptr, 
      CURLFORM_COPYNAME, "submit", 
      CURLFORM_COPYCONTENTS, "send", 
      CURLFORM_END); 

    curl = curl_easy_init(); 
    /* initialize custom header list (stating that Expect: 100-continue is  not 
    wanted */ 
    if(curl) { 
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); 
    /* what URL that receives this POST */ 
    curl_easy_setopt(curl, CURLOPT_URL, url); 
    if (res != CURLE_OK) { 
     printf("could not set url : %s\n",curl_easy_strerror(res)); 
    } else { 
     printf("able to set\n"); 
    } 
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); 
    curl_easy_setopt(curl, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); 
    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); 

    /* Perform the request, res will get the return code */ 
     printf("calling curl_easy_perform\n"); 
    res = curl_easy_perform(curl); 
    /* Check for errors */ 
    if(res != CURLE_OK){ 
     fprintf(stderr, "curl_easy_perform() failed: %s\n", 
       curl_easy_strerror(res)); 
    } 
     printf("after calling curl_easy_perform\n"); 
    /* always cleanup */ 
    curl_easy_cleanup(curl); 

    /* then cleanup the formpost chain */ 
    curl_formfree(formpost); 
    } 
    curl_global_cleanup(); 
    return 1; 
} 

私はポスト応答として取得しています冗長な出力です: -

> POST /repo/proc.out HTTP/1.1 
Host: 10.1.2.3 
Accept: */* 
Content-Length: 0 
Expect: 100-continue 
Content-Type: multipart/form-data; boundary=----------------------------8708d4558a12 

< HTTP/1.1 404 Not Found 
< Date: Sat, 28 May 2016 07:37:10 GMT 
* Server Apache/2.2.15 (CentOS) is not blacklisted 
< Server: Apache/2.2.15 (CentOS) 
< Content-Length: 289 
< Connection: close 
< Content-Type: text/html; charset=iso-8859-1 
< 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<html><head> 
<title>404 Not Found</title> 
</head><body> 
<h1>Not Found</h1> 
<p>The requested URL /repo/proc.out was not found on this server.</p> 
<hr> 
<address>Apache/2.2.15 (CentOS) Server at 10.1.2.3 Port 80</address> 
</body></html> 
* Closing connection 0 

最も素晴らしい部分は私も、コマンドラインでファイルをアップロードすることはできないですし、同じエラーを取得: - -F [email protected]カールhttp://10.1.2.3/repo

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<html><head> 
<title>404 Not Found</title> 
</head><body> 
<h1>Not Found</h1> 
<p>The requested URL /repo/ was not found on this server.</p> 
<hr> 
<address>Apache/2.2.15 (CentOS) Server at 10.1.2.3 Port 80</address> 
</body></html> 

しかし、私は同じパスすなわちからファイルをダウンロードすることができています「http://10.1.2.3/repo/available_file.jpeg

httpサーバ上で設定するために何か追加する必要がありますか、またはサーバにファイルをアップロードするためにスクリプト/プログラムがサーバ上で実行されている必要がありますか?

いずれかお手伝いできますか?

+0

サーバー上で実行されているものは何ですか?ポストリクエストのハンドラを表示できますか? – cnicutar

+0

404バックとは、これを正しいURLに送信していないことを意味します。 –

+0

@DanielStenberg私のWebブラウザでは「http://10.1.2.3/repo/」にアクセスできます。利用可能なディレクトリ。それに "available_file.jpeg"が含まれているとしたら、urlを "http://10.1.2.3/repo/available_file.jpeg"として渡すことでカール要求でダウンロードすることができます。 POSTで「send_file.jpeg」と「http://10.1.2.3/repo/」とファイルをアップロードしたいのですが、「要求されたURL/repo /がこのサーバーに見つかりませんでした」と表示されます。 POSTの場合、これをどのように利用できないのでしょうか? – r4nj4n

答えて

0

あなたはCGIスクリプト/レポで、または

/repo/proc.outあなたのデータを処理するCGIスクリプトはWebサーバ環境でサポートされる言語で書かれるべき必要があります。

スクリプトは環境を読み取り、スクリプトに送信されたデータを処理して処理し、カールスクリプトに応答を送信します。

一部のWebサーバーには、デフォルトのCGIスクリプトが付属しています。このスクリプトは、データを元に戻すだけです。これはcgi-binディレクトリにあります。

+0

あなたは、サーバー上でスクリプトを実行する必要があると言っていますか? – r4nj4n

+0

はい、スクリプトは、そのスクリプトのヘッダーで定義されているスクリプト言語を使用して、Webサーバーソフトウェアによって実行されます。 –

関連する問題