ホームページ >バックエンド開発 >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:'; 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 = 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_……
#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 のみを使用しました
悪くありません。 ! ! ! ! !
私も欲しいです