2

Express.js と socket.io を使用して node.js で指定したディレクトリに画像を保存しようとしましたが、うまくいきません。

クライアント側:

var reader = new FileReader();
function drop(e) {
    e.stopPropagation();
    e.preventDefault();

    var dt      = e.dataTransfer;
    var files   = dt.files;
    jQuery.each(files, function(){

        reader.onload = function(e) {
            socket.emit('sendfile', e.target.result);
        };
    });
    return false;
}

画像はドラッグ&ドロップ機能でアップロードしてください。

次に、サーバー側で:

io.sockets.on('connection', function (socket) {
[...]
    socket.on('sendfile', function (data) {
        var fs = require('fs');
        app.use(express.bodyParser({ keepExtensions: true, uploadDir: '/uploaded' }));

        io.sockets.emit('updatechat', socket.username, data); //test
    });

私も試してみました

socket.on('sendfile', function (data) {
        var fs = require('fs');
        fs.writeFile('/uploaded/test.png', data, "binary" , function (err) {
          if (err) throw err;
          console.log('It\'s saved!');
        });
        io.sockets.emit('updatechat', socket.username, data); //data test
    });

しかし、それは何も保存しません。「データテスト」は、データがすでにサーバーに到着していることを示しているため、問題がクライアント側にあるとは思いませんが、サーバー側では何が間違っているのかわかりません

4

2 に答える 2

8

ソケットを介したファイルアップロードの使用法を説明する簡単な例を作成しました!

手順は次のとおりです。

  1. app.js でファイルを受信するsend-file socket.io イベントを作成します。受信したこのファイルはバイナリ ファイルです。
  2. jade/HTML ページに、入力ファイルとそれを送信するためのボタンを配置します。注: マルチパート コンテンツを含む投稿を送信するためにマルチパートを使用する必要はありません。TCP 要求/応答ではなくソケット ファイルを送信しています。
  3. HTML5 ファイル API サポートを初期化し、リスナーがファイル入力コンポーネントを監視できるように準備します。
  4. 残りの残りのルーチンは、ファイルを読み取り、コンテンツを転送します。

最初のステップ (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 を介した完全な非同期トランザクションです。

この投稿がお役に立てば幸いです。

于 2013-02-09T22:15:10.547 に答える
0

アップロードを一時停止/再開できるため、このチュートリアルはもう少し先に進みますが、socketio を介してファイルをアップロードする方法を見つけることができます :)

于 2013-02-09T16:03:01.973 に答える