ホームページ >バックエンド開発 >PHPチュートリアル >200 点 CURL 設定 HTTPHEADER アップロード ファイルの問題!

200 点 CURL 設定 HTTPHEADER アップロード ファイルの問題!

WBOY
WBOYオリジナル
2016-06-23 13:52:352484ブラウズ

ファイルをアップロードするために 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……


CURLOPT_HTTPHEADER であるようです)使用されません。

http://cn.php.net/fsockopen

CTRL + F ファイルアップロード用の http リクエスト ヘッダーを作成するのは当然です。同じリクエスト ヘッダーの構築に問題があります


ありがとう、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;

型があることがわかりました。 Linux では n を rn に置き換える必要があります。初期の頃、sun は ms に匹敵できませんでしたし、今もそれはできませんよね?タイプは PHP コードです

$varname = 'my';

$type = 'text/plain';

$key = a626fcdd588a984ff7ad37455cad6727
a777cd6a6d261d753f869a0e01eda099 ? php
print_r(……

クライアントがありません?


完全なコード PHP コード
$contents =bdcd5d120e3c6ecd06f59ed1587320eb
print_r( …


最好能分开发一下,谢谢

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 のみを使用しました

悪くありません。 ! ! ! ! !

私も欲しいです

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。