2014-09-02 3 views
2

저는 mongodb를 처음 사용합니다. 코드 아래에node.js 서버의 응답으로 이진 데이터를 보내는 방법

내가 저장된 바이너리 데이터 :

var data = fs.readFileSync(path); 
    var image = new mongodb.Binary(data); 
    //open connection/collection 
var record = {picname: id, content: image }; 
collection.save(record, {safe: true}, function(err,result){ 
    if(err) 
    console.log(err.stack); 
    });//save 

나는 DB의 레코드 사이즈를 볼 수 있습니다. 바이너리 데이터가 있습니다. 레코드 크기는 파일 크기와도 일치합니다. 행복하다. 몽고와 응답을 보내려고에서

이제 검색 같은 바이너리 데이터 :

var record = {picname: id}; 
    collection.findOne(record, function(err,result){ 
    if(err) 
    console.log(err.stack); 
    else 
    { 
    console.log('before read from db for download.'); 
    //HOW TO READ IMAGE/BINARY DATA FROM RESULT? 
               //I need to send result in response. Any Idea? 
    console.log('before read from db for download'); 
    } 
    }); 

나는 아래의 코드와 바이너리 데이터를 전송하고 있습니다. 모든 파일에서 작동하지 않습니다. 문제가 될 수있는 내용 :

collection.findOne(record, function(err,result){ 
       if(err) 
        console.log(err.stack); 
       else 
       { 
        console.log('before read from db for download. result: [' + result.picname + " ], type: " + result.imagetype); 
        res.end(result.content.buffer, "binary"); 
        console.log('Responded SUCCESS: ' + id); 
       } 
      });//findOne 

응답을 통해 검색하고 전송하는 방법을 알려주십시오.

미리 감사드립니다. DD.

+0

"모든 파일에서 작동하지 않습니다." 어떤 파일이 작동하며 어떤 파일이 작동하지 않습니다. 패턴이 있니? 또한, ** ** 작동하지 않는 방법은 무엇입니까? 오류가 발생 했습니까? 파일이 손상 되었습니까? –

+0

때때로 작동하지 않는 것으로 알려진 gif. – user3297351

+0

GridFS를 사용하면 다음과 같은 방법으로 쓸 수 있습니다 :'file.stream (true) .pipe (res);' – vedi

답변

0

여기서의 문제는 데이터를 저장하고 읽는 것과 관련이 없지만 실제로는 콘텐츠 형식에 관한 것입니다. 따라서 응답을 보낼 때 올바른 헤더 정보를 반환 할뿐만 아니라 데이터와 함께이 정보를 저장하는 것이 이상적입니다.

이 부분은 MIME 유형 감지입니다.

var record = {picname: id}; 
collection.findOne(record, function(err,result){ 
    if(err) 
     console.log(err.stack); 
    else { 
     res.writeHead(200, { 
      'Content-Type': result.mimeType, 
      'Content-Length': result.content.length 
     }); 
     res.write(result.content.buffer); 
     res.end(); 
    } 
}); 

그래서 어떻게 효율적으로 반환됩니다 : 사용 가능한 모듈이 있습니다와 같이 호출 노드에 대해 mmmagic은 다양 헤더를 작성하기위한

var Magic = require('mmmagic').Magic; 

var magic = new Magic(); 

var data = fs.readFileSync(path); 
var image = new mongodb.Binary(data); 


//open connection/collection 

magic.detect(data,function(err,result) { 

    var record = {picname: id, content: image, mimeType: result }; 

    collection.save(record, {safe: true}, function(err,result){ 
     if(err) 
      console.log(err.stack); 
    });//save 

}); 

방법 중 하나이지만,베이스에 "http" 여기에 올바른 MIME 형식으로 식별 된 바이너리 데이터가 있습니다. 따라서 URL을 통해 액세스 할 수 있습니다. URL을 통해 문서를 검색하고 브라우저에서 직접 볼 수 있습니다. 마치 이미지 파일이 제공되는 것처럼 보이게됩니다.

+0

응용 프로그램이 content.length에서 중단됩니다. 그래서, result.mimetye 만 추가되었습니다. 일부 파일에는 정상적으로 작동합니다. 모든 파일이 아닙니다. – user3297351

관련 문제