ホームページ >バックエンド開発 >PHPチュートリアル >200 ポイント ファイルをアップロードするための CURL 設定 HTTPHEADER の問題を解決してください。
ファイルをアップロードするために 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:';
$header[]= 'Expect:';
3. 本文ではなく http ヘッダーのみを取得するようにcurlを設定します:
Java コード
curl_setopt($ch , CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
Java コード
curl_setopt($ch, CURLOPT_HEADER, 0); // 本体を取得することを確認します
curl_setopt($ch, CURLOPT_NOBO DY, 0) ; // を取得することを確認しますbody
curl_setopt($ch, CURLOPT_NOBODY, 0);
4. 仮想ホストにアクセスするには、Host を設定する必要があります
$header[] = 'Host : '.$host; 5. post、 put、delete などで URL にアクセスします
post:
curl_setopt($ch, CURLOPT_POST, 1);
put、delete:
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); // または PUT、サーバーはこれらのメソッドをサポートする必要があります。
6. ダウンロードしたコンテンツをファイルとして保存します
curl_setopt($ch, CURLOPT_FILE, $fp);
プロジェクト内でのcurlの使用方法をいくつかまとめます
1. phpのデフォルトの呼び出しメソッドcurl、URLにアクセスするgetメソッド
Java コード
....
$ch =curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //http ヘッダーを設定します
curl_setopt($ch, CURLOPT_ENCO....
It CURLOPT_HTTPHEADER は使用されていないようです
CTRL + F でファイルアップロード用の http リクエストヘッダーを作成するだけです。 CURL を使用して同じリクエスト ヘッダーを作成するのは問題ありません
ありがとう、CURL はこのアップロード メソッドをサポートしていませんか?
たぶんもっと複雑なので、curl は作業を終了して '@' を提供します。ヘッダーとデータを自分で構築する方法
しかし、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';$name = '3.txt';$type = 'text/plain';$key = <<< TEXT$varname"; filename="$nameContent-Type: $typeTEXT;$fields[$key] = $contents;型であることがわかりました 注: 私は win 環境で使用しており、Linux 環境では n を rn に置き換える必要があります。
初期の頃は sun は ms に勝てなかったし、今も無理ですよね
アップロードされたファイルの型は php で認識されると思っていましたが、実際には提供されていることがわかりました。ブラウザによる
$varname = 'my';
$key = 818f4a5f46a2cfb253df307390f5e421
80faf829dae7a2f5889d8308b67ab943 phpcurl_upload_server.php
http文件上传协议,主要是那个boundary,这个东西就是标识一个文件的内容和类型以及各种上传参数的token,其它和普通的POST提交也没啥区别。
fsockopen来写http请求就比较直白,用curl的话模拟对应的请求头和body就好了。
PHP code
//what file you want to upload
$uploadFile = file_get_……
非常感谢,CURL部分的代码我这边测试成功了,我再加一百分
#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……
感谢,curl_multi很有用
to #21
你这样做是不行的,应该使用 curl_multi 并发
不然把一个文件拆成几个,一次性传出,再在服务器端组装。有什么意义?
说的也是哈,不过curl_multi的并发,对于请求不同的url后获取数据比较有意义,就是说是并行请求不同的url获取http返回。如果往同一url请求,要么就一次请求,要么就分发多次请求,多次请求有个性能消耗在于每次都要scoket连接/销毁,但是能控制请求字节数。
引用 23 楼 的回复:
to #21
你这样做是不行的,应该使用 curl_multi 并发
不然把一个文件拆成几个,一次性传出,再在服务器端组装。有什么意义?
说的也是哈,不过curl_multi的并发,对于请求不同的url后获取数据比较有意义,就是说是并行请求不同的url获取http返回。如果往同一url请求,要么就一次请求,要么就分发多次请求,多次请求有个性能消耗在于每……
忘了如果服务器支持keep-alive的话,无需进行多次socket create,呵呵
一路上传不能充分利用网络资源,多路并发可使上传速度加快
引用 26 楼 的回复:
引用 23 楼 的回复:
to #21
你这样做是不行的,应该使用 curl_multi 并发
不然把一个文件拆成几个,一次性传出,再在服务器端组装。有什么意义?
说的也是哈,不过curl_multi的并发,对于请求不同的url后获取数据比较有意义,就是说是并行请求不同的url获取http返回。如果往同一url请求,要么就一次请求,要么就分发多……
嗯,基本上都支持keep-alive了
一路上传不能充分利用网络资源,多路并发可使上传速度加快
嗯,网络利用率更高
CSDN的编辑器还是没改进,同时回复多个还需要手动复制代码。。。
嗯,服务器可开多线程/进程处理你的并发上传请求,这是快的缘故。
十分なリソースがある限り、あと数チャネル開いても問題ありません。多くても、そのほとんどがブロックされていれば、単一チャネルと同等になります。
マルチチャネル送信用に設計する利点は、次のとおりです。データの特定のセグメントの送信に失敗した場合、再送信できること。
これはシングルチャネル送信設計では不可能です
http://cn.php.net/fsockopen
CTRL + F 検索境界、例を見てください。ファイルアップロード用の http リクエストヘッダーを構築するだけです。 CURL で同じリクエスト ヘッダーを構築しても問題ないはずです。
PHP マニュアルに従って実行しましたが、うまくいきませんでした
5 階の回答から引用:
http://cn.php.net/fsockopen
CTRL + F 境界を検索し、例を見て、ビルドしますアップロードするファイル http リクエスト ヘッダーだけで十分です。CURL が同じリクエスト ヘッダーを問題なく構築できるのは当然です。
PHP マニュアルに従ってみたのですが、うまくいきませんでした
そうですか? Wireshark、smartsniff、その他のツールを使用して http リクエスト フォーマットをチェックし (firebug または chrome に付属の F12 キーでも機能するはずです)、ファイル アップロード アクションを実行して、ファイルがアップロードされたときに http リクエスト フォーマットを観察することもできます。
ソケット コードを投稿します:
私がテストしたバックアップ!
http://webinno.cn/blog/article/view/40
CURLOPT_HEADERFUNCTION このパラメータは HTTP プロトコルのコールバックを設定でき、参照できます
いくつかのパラメータを設定している限り、curl はプロトコルヘッダー自体
皆さん、ありがとう!
ダウンロードを提供するために Content-Type のみを使用しました
悪くありません。 ! ! ! ! !
私も欲しいです