2

学校が提供する専用サーバーに学校の課題をアップロードするための小さなツールに取り組んでおり、 のラッパーであるocamlandを使用することにしました。コマンドラインから (curl を使用して) やりたいことはすべて取得できますが、ocurl を使用してファイルをアップロードすることはできません。ocurlocamllibcurl

multipart/form-dataこれは、サーバーページがコンテンツタイプとして期待しているためだと思います。libcurl私が使用したドキュメントを読んだ後curl_formadd()(コマンドラインからそれを行います)、ocurlはそれを行うことができません(このようなものは見つかりませんでしたcurl.ml

作業中のcurlコマンドライン:

curl -v "myhost/upload2.php" --form "fichier1= @file.tar.gz" --form "MAX_FILE_SIZE=1000000" -b cookie

応答

> POST /upload2.php HTTP/1.1
> User-Agent: curl/7.32.0
> Host: myhost
> Accept: */*
> Cookie: PHPSESSID=4qbihrkhode23902q1v988a114; cookie_test=1
> Content-Length: 10563
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------53aa2e4a08d1f7c0
> 
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Date: Wed, 23 Oct 2013 17:34:21 GMT
* Server Apache/2.2.16 (Debian) is not blacklisted
< Server: Apache/2.2.16 (Debian)
< X-Powered-By: PHP/5.3.3-7+squeeze17
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 2265
< Content-Type: text/html
<

私の最も近い非動作ocamlコード

let fetch connection url =
Printf.printf "Retriving %s ...\n" (url);
flush stdout;
Curl.set_url connection url;
Curl.perform connection;
Curl.set_post connection false
in
Curl.global_init Curl.CURLINIT_GLOBALALL;
let connection = Curl.init() in
Curl.set_verbose connection true;  
let curl_file_option = Curl.CURLFORM_FILECONTENT("fichier1","file.tar.gz",Curl.CONTENTTYPE "application/x-tar") in                                     
Curl.set_maxfilesize connection (Int32.of_int 1000000);                                                                                                      
Curl.set_httppost connection [curl_file_option];
fetch connection (baseURL^"upload2.php");
;;

100%のCPUを使用する以外は何もしません

最後に、質問は次のとおりです。独自の formdata 関数を作成するのを手伝ってくれませんか?

4

1 に答える 1

0

curl マニュアルをよくお読みください

   CURLFORM_FILECONTENT
          followed by a filename, causes that file to be read and its contents used as data in this part. This part does not automatically become a file upload part
          simply because its data was read from a file.

つまり、CURLFORM_FILE を使用するだけです。元のコードが 100% の CPU を引き起こす理由はまだわかりません。

また、ocurl は curl_formadd を必要としないという理由だけで提供しません。set_httppost は既にリストを取得しています。

于 2013-11-07T05:48:58.903 に答える