2011-10-05 5 views
0

私は自分のサーバー上にファイルをアップロードし、その内容に従って名前を付けたいと思います。これはシンプルでなければならない(それはPythonで書かれている)が、Node.jsでそれを行う方法を考えるのは苦労している。Node.jsでファイルのコンテンツをアップロード、ストリーミング、ハッシュするにはどうすればよいですか?

私はエクスプレスおよび接続フォームを使用していますが、really just usesformidableです。私はまた、そのノードがpythonのhashlibに非常に似ているcryptoというライブラリを持っているのを見ています。今私はちょうど私が与えると一時的にファイルをストリームする方法を理解する必要があります - それをハッシュします。

これは私がしたいと思う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)) 

は、私はこれらのtoy answers that just print out the file's 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('....'); 
     } 
    }); 

}); 
+0

最下部のhttps://gist.github.com/893110 –

答えて

2

1

あなたは、このようなファイルを保存することができます。

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 

はむしろ可能性がより効率的になく、はるかに複雑になり手ごわいにハッシュ計算を、ハッキングよりも、私はちょうどその一時的な場所からファイルを再読み込みして、それをハッシュすることにしました。他の例のようにポンピングする代わりに、一時ファイルを新しい場所に変更しました。

+0

クローズしても、その内容に基づいてファイルの名前は付けられません。私はこれを考え出したと思う。 –

関連する問題