私は自分の仕事でそのような要件に遭遇し、ファイルをアップロードするためにnodejsを使用する必要がありました。以前は、ブラウザを介してファイルをアップロードする方法のみを知っていました。 nodejsを使用する場合、ブラウザの動作をシミュレートするのと同等です。 Googleの後、ブラウザがHTTPプロトコルを使用してデータをサーバーに送信するだけであることに気付きました。特定のプロトコルは、「RFC 1867-フォームベースのファイルアップロードHTML」です。ブラウザ上のフォームフォームを介してファイルをアップロードすることは、このプロトコルを使用しています。まず、ブラウザがサーバーに送信するデータを確認し、次にコピーに従ってアップロード機能を実装できます。フォームにファイルをアップロードする場合、誰もが慣れている必要があります。
<form action = "http://www.qq.com/" method = "post"> <入力タイプ= "text" name = "text1" /> <br /> <入力タイプ= "text" name = "text2" /> <br /> <input "" /> < /form> <入力> <
送信すると、Fiddlerを使用してパケットをキャプチャすることにより、次のデータがサーバーに送信されることがわかります。
投稿http://www.qq.com/ http/1.1
ホスト:www.qq.com
コンテンツレングス:23
コンテンツタイプ:Application/X-WWW-Form-Urlencoded; charset = utf-8
text1 = hello&text2 = world
コンテンツタイプのデフォルトがアプリケーション/X-WWW-Form-UrlENCODEDであることに注意する価値があるため、メッセージはURLエンコードされます。たとえば、「Hello」は%E4%BD%A0%E5%A5%BDとしてエンコードされます。
次に、フォームのアップロード方法を見てみましょう。誰もが慣れているはずです:
<form action = "http://www.qq.com" method = "post" enctype = "multipart/form-data"> <input type = "file" name "name"/> <入力タイプ= "submit" value = "submit"/> </form>
次に、hello worldという単語のみを使用して新しいupload.txtテキストファイルを作成し、アップロードします。フィドラーを使用してパッケージをつかみます。過去のデータの送信はもう少し複雑であることがわかります(キャッシュコントロールやCookieなど、他の多くの無関係な要求ラインが削除されています):
投稿http://www.qq.com/ http/1.1
ホスト:www.qq.com
コンテンツレングス:199
コンテンツタイプ:MultiPart/Form-Data;境界= --- webkitformboundarywr3x7sxbyqq4zf5g
----- webkitformboundarywr3x7sxbyqq4zf5g
コンテンツ拡張:form-data; name = "myfile"; filename = "upload.txt"
コンテンツタイプ:テキスト/プレーン
こんにちは世界
----- webkitformboundarywr3x7sxbyqq4zf5g--
RFC 1867の定義によれば、境界データを生成する必要があります。このデータは、コンテンツの他の場所に表示されません。これは自分で定義できます。各ブラウザの生成アルゴリズムは異なる場合があります。上記の境界は、データを分離することです。分離されたデータを生成した後、分離されたデータをヘッドのコンテンツタイプに配置してサーバーに送信できます。つまり、上記のコンテンツタイプ:MultiPart/Form-Data。 boundary = --- webkitformboundarywr3x7sxbyqq4zf5gに加えて、アップロードされたコンテンツは別々のデータを持ついくつかのセグメントに分離する必要があり、データの各セグメントにはファイル名とアップロード時の名前があります。サーバーはこの名前を使用してファイルとファイルタイプのコンテンツタイプを受信します。この例では、テキスト/プレーン。アップロードされたPNG画像が画像/PNGの場合、それは画像/PNGです。ファイルタイプの空白行の後、アップロードされたファイルのコンテンツも理解しやすいです。この例では、アップロードされたテキストファイルがコンテンツを直接表示できるようにするためです。アップロードされた画像ファイルがバイナリファイルである場合、フィドラーはCarled Codeを表示します。ファイルのコンテンツが終了すると、空白行と境界データがあります。
送信フォーマットの詳細を理解した後、次のステップは、nodejsを使用してプログラムおよび実装することです。簡単に言えば、形式に従ってデータをサーバーに送信するだけです。
const http = require( 'http'); const fs = require( 'fs'); // postアドレスはローカルサービスのPHPであり、アップロードが成功したかどうかをテストするために使用されます。 '--- webkitformboundaryjlvkbqxtii0ygpab'; //アップロードする必要があるファイルコンテンツを読み取りますfs.readfile( './ upload.txt'、function(err、data){//分離されたデータセグメントvar payload = ' - ' + boundarykey + '/r/n' + 'content-disposition:form-data; name = "myfile"; filename = "/r/r/n' + 'content-type:text/plain/r/n/r/n'; payload + = data; payload + = '/r/n - ' + boundarykey + ' - '; //リクエストの送信var req = http.request(options、function(res){res.setencoding( 'utf8'); chunk);} boundary = '+boundarykey+' '); req.setheader(' content-length '、buffer.bytelength(payload、' utf8 ')); req.write(payload); req.end();});この記事の焦点は、プロトコルを理解し、コードで実装することです。コード組織にはまだ多くの最適化があります。
最後に、ローカルApacheで、アップロードされたファイルを保存するPHPを作成してテストとして使用します。
<?php $ filepath = './upload.txt';move_uploaded_file( $_files ['myfile'ty]、$ filepath); echo "ok";?>
さらに、RFC 1867によると、複数のファイルを一度にアップロードする機能を実現できます。これについてはここで詳しく説明しません。必要に応じて、詳細な実装についてはRFC 1867を参照してください。
上記は、編集者によって導入されたnode.jsファイルアップロードです。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!