ファイルのアップロード時に、大きなファイル (.ISO) のチェックサムを生成する必要があります。ExpressJS/Connect を使用して、POST (マルチパート) 経由でアップロード要求を処理しています
//express setup app.js
app.use('/upload',express.bodyParser({
defer : true, //enable progress event
keepExtensions : true,
limit : app.locals.fileLimit,
uploadDir : path.join( __dirname, '..', 'tmp'),
hash : true //this doesnt appear to do anything
}));
//express route routes.js
app.post("/upload", function(req, res){
var fs = require('fs');
var format = require('util').format;
req.form.hash = true; //this doesnt return the hash for some reason
req.form.on('fileBegin', function(err) {
log.info("Starting new upload...");
});
req.form.on('file', function(name, file) {
fs.rename(file.path, req.form.uploadDir + "/" + file.name);
console.info(file);
});
req.form.on('error', function(err) {
log.error('error',err);
req.resume();
});
req.form.on('field', function(field, value) {
log.info("Passed Field (%s=%s)...",field,value);
});
//this part event never gets called for some reason but
//I imagine this is where you might do a hash update
req.form.on('part', function(part){
console.log('PART upload %s %s', part.name, part.filename);
var out = fs.createWriteStream('../tmpstrm/' + part.filename);
part.pipe(out);
});
req.form.on('progress', function(bytesReceived, bytesExpected) {
var percent = (bytesReceived / bytesExpected * 100) | 0;
console.info( "PROGRESS :"+ ((bytesReceived / bytesExpected)*100) + "% uploaded");
});
req.form.on('end', function() {
var fileInfo = format('\nuploaded %s (%d Kb) to %s as %s'
, req.files.upload.name
, req.files.upload.size / 1024 | 0
, req.files.upload.path
, req.body.title);
res.locals.fileInfo = fileInfo; //renders info in jade
res.render('media/index');
});
});
特定の質問に関する情報があまり見つかりませんでした。おそらく典型的なユースケースではありません。しかし、私が見つけた1つの質問には、データイベントでハッシュを更新する方法の簡単な例がありました
var hash = crypto.createHash('sha1');
var data = // incoming file data
data.on('data', function(chunk){
hash.update(chunk);
});
data.on('end', function(){
var sha = hash.digest('hex');
// Do something with it
})
私はストリーミングやチャンクなどに慣れていないので、ここでいくつかのガイダンスをいただければ幸いです。