2011-10-05 4 views
0

내 서버에 파일을 업로드하고 그 내용에 따라 이름을 지정하고 싶습니다. 이 작업은 간단해야합니다 (파이썬 임).하지만 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

닫기가되었지만 여전히 그 내용을 기반으로 파일의 이름을 지정하지는 않습니다. 나는 이것을 알아 냈다고 생각한다. –

관련 문제