ファイルをアップロードするために CURL を使用して HTTPHEADER を設定した経験のある人はいますか?
アドバイスをお願いします
PS: ファイル名は「@」ではありませんが、Content-Type: application/octet-stream
curl はこれをサポートしていません。データ パッケージを構築する方法は、自分で行う必要があります。私は調査しました
curl はこのメソッドをサポートしていません。データ パケットを自分で構築する必要があります。調べてみました
http://cn.php.net/fsockopen
CTRL + F を押して境界を検索するだけです。CURL では問題なく構築できるはずです。同じリクエストヘッダー。
プロジェクトでcurlを使用するいくつかの方法をまとめます
1. phpのcurlのデフォルトの呼び出しメソッド、getメソッドでURLにアクセスします
Javaコード
....
$ch =curl_init()
curl_setopt($ch, CURLOPT_HTTPHEADER; , $header); //http ヘッダーを設定します
curl_setopt($ch, CURLOPT_ENCODING, "gzip" ) //gzip 圧縮をサポートするようにクライアントを設定します
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); //
curl_setopt ($ch, CURLOPT_URL, $url);
curl_exec($ch);
if ($error =curl_error($ch)) {
//エラー処理
return -1 }
fclose($fp) ;
$curl_code =curl_getinfo($ch, CURLINFO_HTTP_CODE); //http 戻り値を取得
if($curl_code == 200) {
//通常のアクセス URL
}
//例外
....
. .. .
$ch =curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); // http ヘッダーを設定します
curl_setopt($ch, CURLOPT_ENCODING, "gzip"); // gzip 圧縮のサポートを設定しますclient
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 30 ); // 接続待機時間を設定します
curl_setopt($ch, CURLOPT_URL, $url ); {
// エラー処理
return -1; $curl_code == 200 ) {
//通常のアクセス URL
}
//例外
....
2. lighttpd サーバーへのcurl アクセスをサポートするように http ヘッダーを設定します
Java コード
$header[]= 'Expect:'; 3. 本文ではなく http ヘッダーのみを取得するようにcurlを設定します。
Java コード
curl_setopt($ch, CURLOPT_HEADER, 1); , 1);
curl_setopt($ch, CURLOPT_HEADER, 1) ;
本文を取得する:
Java コード
curl_setopt($ch, CURLOPT_HEADER, 0);ボディを取得することを確認します
curl_setopt($ch, CURLOPT_NOBO DY, 0) ;
curl_setopt($ch, CURLOPT_HEADER, 0) // ボディを取得することを確認します
curl_setopt($ch, CURLOPT_NOBODY, 0); 4. 仮想ホストにアクセスするには、Host
$header[] = 'Host : '.$host; を設定する必要があります。 5. post、put、delete などの REStful メソッドを使用して、URL
post にアクセスします。
curl_setopt($ch, CURLOPT_POST, 1);
挿入、削除:
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); // または PUT、サーバーはこれらのメソッドをサポートする必要があります。
6. ダウンロードしたコンテンツをファイルとして保存します
curl_setopt($ch, CURLOPT_FILE, $fp);
プロジェクト内でのcurlの使用方法をいくつかまとめます
1. phpのcurlのデフォルトの呼び出しメソッド、getでURLにアクセスしますメソッド
Java コード
....
$ch =curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); // http ヘッダーを設定
curl_setopt($ch, CURLOPT_ENCO……
http://cn.php.net/fsockopen
CTRL + F ファイルアップロード用の http リクエスト ヘッダーを作成するのは当然です。同じリクエスト ヘッダーの構築に問題があります
ただし、アップロードされたファイルを表すためにcurl CURLOPT_UPLOADが依然として提供されていますが、実際にはPUTリクエストが使用されます
これはファイルをftpにアップロードする場合にのみ適しています
phpでは、php://input
から読み取る必要があります
#5 で指定されたコードは失敗します。このようなリクエストが特定され、ファイルのアップロード セクションがコメント化されましたが、それでもこのエラーが報告されました。しかし、curl PUT データグラムを比較すると、違いはないようです。
わかりました、このように書くだけです !
$contents =<<< 'TEXT'数据报中应该是Content-Disposition: form-data; name="userfile"; filename="file_name"Content-Type: 文档类型文件内容这样的格式,我只实现了文件名部分,文档类型不知道如何实现。这样上传后就取不到 type 的值curl_upload_server.php<xmp><?phpprint_r($_FILES);echo "文件内容:\n";$p = current($_FILES);readfile($p['tmp_name']);TEXT;$fields['f"; filename="x.x'] = $contents; //这个关联键的写法很怪异吧?$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://localhost/curl_upload_server.php"); curl_setopt($ch, CURLOPT_POST, 1 );curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$s = curl_exec ($ch); curl_close ($ch); echo $s;
$varname = 'my';
$type = 'text/plain'; $key = <<< filename= "$name
Content-Type: $type
TEXT;
$fields[$key] = $contents;
注: 私は Win 環境下にあります、Linux...
ありがとうございます。 HTTPPHEADER 情報を結合することによる CURL アップロードのより完全な POST 例はありますか?
#10 は
curl_upload_server.php です
$varname = 'my';$name = '3.txt';$type = 'text/plain';$key = <<< TEXT$varname"; filename="$nameContent-Type: $typeTEXT;$fields[$key] = $contents;
fsockopen を使用して http リクエストを記述するのは比較的簡単です。curl を使用して、対応するリクエスト ヘッダーと本文をシミュレートするだけです。
$contents =<<< 'TEXT'数据报中应该是Content-Disposition: form-data; name="userfile"; filename="file_name"Content-Type: 文档类型文件内容这样的格式以下是服务器端代码curl_upload_server.php<xmp><?phpprint_r($_FILES); //检查上传信息echo "文件内容:\n";$p = current($_FILES);readfile($p['tmp_name']); //输出上传的文件TEXT;$varname = 'my';$name = '3.txt';$type = 'text/plain';$key = "$varname\"; filename=\"$name\r\nContent-Type: $type\r\n";$fields[$key] = $contents;$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://localhost/curl_upload_server.php"); curl_setopt($ch, CURLOPT_POST, 1 );curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$s = curl_exec ($ch); curl_close ($ch); echo $s;
<?php//what file you want to upload$uploadFile = file_get_contents("/var/www/index.html");//content boundary $boundary = md5(time());$postStr = "";$postStr .="--".$boundary."\r\n";$postStr .="Content-Disposition: form-data; name=\"uptxt\"; filename=\"index.html\"\r\n";$postStr .="Content-Type: text/html\r\n\r\n";$postStr .=$uploadFile."\r\n";$postStr .="--".$boundary."\r\n"; /** use fsockopen to set upload http header and body **/$fp = fsockopen("localhost","80",$errer,$errno,1);fwrite($fp,"POST /upload.php HTTP/1.0\r\n");fwrite($fp,"Content-Type: multipart/form-data; boundary=".$boundary."\r\n");fwrite($fp,"Content-length:".strlen($postStr)."\r\n\r\n");fwrite($fp,$postStr);while (!feof($fp)){ echo fgets($fp, 128);}fclose($fp);/** use curl instead **/$cl = curl_init('http://localhost/upload.php');$boundary = md5(time());curl_setopt($cl,CURLOPT_POST,true);curl_setopt($cl,CURLOPT_HTTPHEADER,array( "Content-Type: multipart/form-data; boundary=".$boundary));curl_setopt($cl,CURLOPT_POSTFIELDS,$postStr);curl_setopt($cl,CURLOPT_RETURNTRANSFER,true);$content = curl_exec($cl);curl_close($cl);echo $content;?>
<?php print_r($_FILES);?>
完全なコード PHP コード
$contents =<<< 'TEXT'
データグラム
Content-Disposition: form- である必要がありますdata; name="userfile"; filename="file_name"
Content-Type: ドキュメント タイプ
このような形式
以下はサーバー側のコードです
完全なコード PHP コード
$contents =<<< 'TEXT'
データグラムは
Content-Disposition: form-data; name= " userfile"; filename="file_name"
Content-Type: ドキュメント タイプ
ファイルの内容
このような形式
以下はサーバー側のコードです
curl_upload_server.php
http文件上传协议,主要是那个boundary,这个东西就是标识一个文件的内容和类型以及各种上传参数的token,其它和普通的POST提交也没啥区别。
fsockopen来写http请求就比较直白,用curl的话模拟对应的请求头和body就好了。
PHP code
//what file you want to upload
$uploadFile = file_get_……
#14 服务器端
#15 客户端
#14 中的 $contents 是待上传的文件内容
上次好像看到你问的是一个文件切分多份,然后上传,如果是这样的话,你要要做的只是用boundary标识多个上传内容区块。比如
$boundary = md5(time());$postStr = "";$postStr .="--".$boundary."\r\n";$postStr .="Content-Disposition: form-data; name=\"uptxt[]\"; filename=\"index_1.html\"\r\n";$postStr .="Content-Type: text/html\r\n\r\n";$postStr .=$uploadFile."\r\n"; #这里是部分文件内容$postStr .="--".$boundary."\r\n";$postStr .="--".$boundary."\r\n";$postStr .="Content-Disposition: form-data; name=\"uptxt[]\"; filename=\"index_2.html\"\r\n"; $postStr .="Content-Type: text/html\r\n\r\n";$postStr .=$uploadFile."\r\n";#这里是部分文件内容$postStr .="--".$boundary."\r\n";
收藏了!
to #21
你这样做是不行的,应该使用 curl_multi 并发
不然把一个文件拆成几个, 一次性传出,再在服务器端组装。有什么意义?
上次好像看到你问的是一个文件切分多份,然后上传,如果是这样的话,你要要做的只是用boundary标识多个上传内容区块。比如
PHP code
$boundary = md5(time());
$postStr = "";
$postStr .="--".$boundary."\r\n";
$postStr .="Content-Disposition: form-data; name=……
引用 21 楼 的回复:
上次好像看到你问的是一个文件切分多份,然后上传,如果是这样的话,你要要做的只是用boundary标识多个上传内容区块。比如
PHP code
$boundary = md5(time());
$postStr = "";
$postStr .="--".$boundary."\r\n";
$postStr .="Content-Dispositi……
to #21
你这样做是不行的,应该使用 curl_multi 并发
不然把一个文件拆成几个,一次性传出,再在服务器端组装。有什么意义?
引用 23 楼 的回复:
to #21
你这样做是不行的,应该使用 curl_multi 并发
不然把一个文件拆成几个,一次性传出,再在服务器端组装。有什么意义?
说的也是哈,不过curl_multi的并发,对于请求不同的url后获取数据比较有意义,就是说是并行请求不同的url获取http返回。如果往同一url请求,要么就一次请求,要么就分发多次请求,多次请求有个性能消耗在于每……
一路上传不能充分利用网络资源,多路并发可使上传速度加快
引用 26 楼 的回复:
引用 23 楼 的回复:
to #21
你这样做是不行的,应该使用 curl_multi 并发
不然把一个文件拆成几个,一次性传出,再在服务器端组装。有什么意义?
说的也是哈,不过curl_multi的并发,对于请求不同的url后获取数据比较有意义,就是说是并行请求不同的url获取http返回。如果往同一url请求,要么就一次请求,要么就分发多……
一路上传不能充分利用网络资源,多路并发可使上传速度加快
CSDN的编辑器还是没改进,同时回复多个还需要手动复制代码。。。
サーバーは複数のスレッド/プロセスを開いて同時アップロード要求を処理できるため、高速です。
リソースが十分であれば、さらにいくつかのチャネルを開いても問題ありません。多くても、そのほとんどがブロックされていれば、単一のチャネルと同等になります。
マルチチャネルを設計する利点。送信とは、データの特定のセグメントの送信に失敗した場合に、その部分を再送信できることです。
これはシングルチャネル送信設計では不可能です
http://cn.php.net/fsockopen
CTRL + F 検索境界、例を見てください。ファイルアップロード用の http リクエストヘッダーを構築するだけです。 CURL が同じリクエスト ヘッダーを構築しても問題がないのは当然のことです。
5 階の回答からの引用:
http://cn.php.net/fsockopen
CTRL + F 検索境界、例を見てください。 、ファイルを構築します。アップロードされた http リクエスト ヘッダーで十分です。当然のことながら、CURL は同じリクエスト ヘッダーを問題なく構築できます。
PHP マニュアルに従ってみましたが、うまくいきませんでした
ソケット コードを投稿します:
私がテストしたバックアップ!
http://webinno.cn/blog/article/view/40
CURLOPT_HEADERFUNCTION このパラメータは HTTP プロトコルのコールバックを設定でき、参照できます
いくつかのパラメータを設定している限り、curl はプロトコルヘッダー自体 サブミッションサーバー
皆さん、ありがとうございます!
ダウンロードを提供するために Content-Type のみを使用しました
悪くありません。 ! ! ! ! !
私も欲しいです