如何上传、流式传输和散列文件';Node.js中的内容是什么?
我想上传我的服务器上的文件,并根据其内容命名。这应该很简单(在python中),但我很难弄清楚如何在Node.js中实现这一点 我使用的是express和connect表单,它是。我还看到该节点有一个名为crypto的库,它与python的hashlib非常相似。现在,我只需要了解如何流化连接表单提供的临时文件并对其进行散列 这是我想做的Python/Flask(ish)实现如何上传、流式传输和散列文件';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
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
我没有将散列计算编入令人生畏的程序,这可能会更有效,但要复杂得多,我选择从临时位置重新读取文件并对其进行散列。然后,我没有像其他示例中那样将其压缩,而是将临时文件重命名为其新位置。在底部底部接近,但仍然没有根据其内容命名文件。我想我已经弄明白了。接近了,但仍然没有根据文件的内容来命名文件。我想我已经弄明白了。