Как вы загружаете, транслируете и хэшируете содержимое файла в Node.js? - PullRequest
0 голосов
/ 05 октября 2011

Я хотел бы загрузить файлы на свой сервер и назвать их в соответствии с их содержимым.Это должно быть просто (это в python), но мне трудно понять, как это сделать в Node.js.

Я использую экспресс и форму подключения, которая на самом деле просто использует грозный .Я также вижу, что у узла есть библиотека с именем crypto, которая очень похожа на hashlib в python.Теперь мне просто нужно понять, как потоковая передача временного файла дает мне форма подключения и хеширует ее.

Это реализация Python / Flask (ish) того, что я хотел бы сделать.1010 *

Я видел много таких игрушечных ответов, которые просто распечатывают имя файла , но ни одного, которые действительно читали и записывали данные.

Ответы [ 2 ]

3 голосов
/ 05 октября 2011

Здесь он написан с использованием кофе-скрипта во всей его красе.

app.post '/upload', (request, response, next) ->
    request.form.complete (error, fields, files) ->
        if error
            next error
        else
            file = files.file
            [kind, extension] = file.type.split '/'
            hash = crypto.createHash 'sha256'
            stream = fs.createReadStream file.path,
                encoding:'binary'
            stream.addListener 'data', (chunk) ->
                hash.update chunk
            stream.addListener 'close', ->
                digest = hash.digest 'hex'
                new_filename = "#{digest}.#{extension}"
                new_path = "#{UPLOAD_DIR}/#{new_filename}"
                fs.rename file.path, new_path
                response.end new_filename

Вместо того, чтобы превращать вычисление хеш-функции в грозный, что, вероятно, будет более эффективным, но гораздо более сложным, я решил просто повторнопрочитайте файл из его временного местоположения и хэшируйте это.Затем вместо того, чтобы качать его, как в других примерах, я просто переименовал временный файл в его новое местоположение.

1 голос
/ 05 октября 2011

вы можете сохранить файл так:

var fs = require('fs'),
    util = require('util'),
    crypto = require('crypto');

// ...

req.form.complete(function (err, fields, files) {

    // ...

    var ext = files['content[media]']['filename'].split('.');
        ext = ext[ext.length-1];
        ext = ext.toLowerCase();

    var newFileName = req['connection']['remoteAddress'] + req['connection']['remotePort'] + Date.now();
    newFileName = crypto.createHash('md5').update(newFileName).digest("hex");
    newFileName += '.' + ext;

    var is = fs.createReadStream(files['content[media]']['path']);
    var os = fs.createWriteStream(app.set('dataDir') + '/' + newFileName);

    // copy file to public folder
    util.pump(is, os, function(error) {
        if (error) {
            console.log("Error copying file to public ... " + error);

            res.redirect("back");
            return;
        }
        else {
            // delete temp file
            fs.unlinkSync(files['content[media]']['path']);

            res.redirect('....');
        }
    });

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...