ソケットを介したファイルアップロードの使用法を説明する簡単な例を作成しました!
手順は次のとおりです。
- app.js でファイルを受信するsend-file socket.io イベントを作成します。受信したこのファイルはバイナリ ファイルです。
- jade/HTML ページに、入力ファイルとそれを送信するためのボタンを配置します。注: マルチパート コンテンツを含む投稿を送信するためにマルチパートを使用する必要はありません。TCP 要求/応答ではなくソケット ファイルを送信しています。
- HTML5 ファイル API サポートを初期化し、リスナーがファイル入力コンポーネントを監視できるように準備します。
- 残りの残りのルーチンは、ファイルを読み取り、コンテンツを転送します。
最初のステップ (app.js):
var io = require('socket.io').listen(8000, {log: false});
io.sockets.on('connection', function(socket) {
socket.on('send-file', function(name, buffer) {
var fs = require('fs');
//path to store uploaded files (NOTE: presumed you have created the folders)
var fileName = __dirname + '/tmp/uploads/' + name;
fs.open(fileName, 'a', 0755, function(err, fd) {
if (err) throw err;
fs.write(fd, buffer, null, 'Binary', function(err, written, buff) {
fs.close(fd, function() {
console.log('File saved successful!');
});
})
});
});
});
2 番目のステップ (私の場合、html ではなく jade を使用しました)
extends layout
block content
h1 Tiny Uploader
p Save an Image to the Server
input#input-files(type='file', name='files[]', data-url='/upload', multiple)
button#send-file(onclick='javascript:sendFile();') Send
script(src='http://127.0.0.1:8000/socket.io/socket.io.js')
script(src='/javascripts/uploader.js')
3 番目と 4 番目のステップ (ファイルをサーバーに送信するための uploader.js のコーディング)
//variable declaration
var filesUpload = null;
var file = null;
var socket = io.connect('http://localhost:8000');
var send = false;
if (window.File && window.FileReader && window.FileList) {
//HTML5 File API ready
init();
} else {
//browser has no support for HTML5 File API
//send a error message or something like that
//TODO
}
/**
* Initialize the listeners and send the file if have.
*/
function init() {
filesUpload = document.getElementById('input-files');
filesUpload.addEventListener('change', fileHandler, false);
}
/**
* Handle the file change event to send it content.
* @param e
*/
function fileHandler(e) {
var files = e.target.files || e.dataTransfer.files;
if (files) {
//send only the first one
file = files[0];
}
}
function sendFile() {
if (file) {
//read the file content and prepare to send it
var reader = new FileReader();
reader.onload = function(e) {
console.log('Sending file...');
//get all content
var buffer = e.target.result;
//send the content via socket
socket.emit('send-file', file.name, buffer);
};
reader.readAsBinaryString(file);
}
}
いくつかの重要な考慮事項:
これは、ソケット ファイル アップローダの小さなサンプルです。ここでは、いくつかの重要なことは考慮していません。すべてのコンテンツを連続して送信するのではなく、ファイルの一部を送信するためのファイル チャンク。送信されたファイルのステータスを更新します (エラー メッセージ、成功メッセージ、進行状況バー、パーセント ステージなど)。これは、独自のファイル アップローダをコーディングするための最初のステップのサンプルです。この場合、ファイルを送信するためのフォームは必要ありません。socket.io を介した完全な非同期トランザクションです。
この投稿がお役に立てば幸いです。