如何上传、流式传输和散列文件';Node.js中的内容是什么?

如何上传、流式传输和散列文件';Node.js中的内容是什么?,node.js,upload,express,Node.js,Upload,Express,我想上传我的服务器上的文件,并根据其内容命名。这应该很简单(在python中),但我很难弄清楚如何在Node.js中实现这一点 我使用的是express和connect表单,它是。我还看到该节点有一个名为crypto的库,它与python的hashlib非常相似。现在,我只需要了解如何流化连接表单提供的临时文件并对其进行散列 这是我想做的Python/Flask(ish)实现 import hashlib from Flask import request def upload(): fi

我想上传我的服务器上的文件,并根据其内容命名。这应该很简单(在python中),但我很难弄清楚如何在Node.js中实现这一点

我使用的是express和connect表单,它是。我还看到该节点有一个名为crypto的库,它与python的hashlib非常相似。现在,我只需要了解如何流化连接表单提供的临时文件并对其进行散列

这是我想做的Python/Flask(ish)实现

import hashlib
from Flask import request

def upload():
  file = request.files['file']
  hash = hashlib.sha256()
  name, ext = file.filename.rsplit('.', 1)
  try:
    for chunk in file.chunks()
      hash.update(chunk)
  finally:
    file.seek(0)
    new_name = "%s.%s" % (hash.hexdigest(),ext)
    file.save(os.path.join(UPLOAD_DIR, new_name))

我见过很多这样的文件,但没有一个是真正读写数据的。

您可以这样保存一个文件:

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('....');
        }
    });

});

您可以这样保存文件:

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('....');
        }
    });

});

在这里,它是在咖啡脚本在所有的荣耀

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

我没有将散列计算编入令人生畏的程序,这可能会更有效,但要复杂得多,我选择从临时位置重新读取文件并对其进行散列。然后,我没有像其他示例中那样泵送临时文件,而是将临时文件重命名为其新位置。

在这里,它在coffee脚本中非常出色

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

我没有将散列计算编入令人生畏的程序,这可能会更有效,但要复杂得多,我选择从临时位置重新读取文件并对其进行散列。然后,我没有像其他示例中那样将其压缩,而是将临时文件重命名为其新位置。

在底部底部接近,但仍然没有根据其内容命名文件。我想我已经弄明白了。接近了,但仍然没有根据文件的内容来命名文件。我想我已经弄明白了。