2013-11-09 2 views
4

와 아마존 S3에서 이미지를 보여주는, 그러나 나는 해결책 닐렌 수 없습니다의나는이 정직하고 일해야한다고 생각 nodejs, expressjs와 녹스

내가하는 가장 좋은 방법을 알아 내려고 노력하고있어를 웹 사이트에서 amazon S3에 저장된 이미지를 표시합니다.

가 현재 나는이 작업을 얻으려고 (실패)

//app.js 
app.get('/test', function (req, res) { 
    var file = fs.createWriteStream('slash-s3.jpg'); 
    client.getFile('guitarists/cAtiPkr.jpg', function(err, res) { 
     res.on('data', function(data) { file.write(data); }); 
     res.on('end', function(chunk) { file.end(); }); 
    }); 
}); 

//index.html 
<img src="/test" /> 

아마존에서 직접 이미지를 보여 어쩌면 가능하지? 내 서버의 부하를 줄이는 솔루션이 가장 좋습니다.

답변

9

streams의 일반적인 사용 사례입니다. 원하는 작업 : Amazon S3에서 파일을 요청하고 임시 파일을 저장하지 않고이 요청의 응답 (예 : 이미지)을 직접 클라이언트로 리디렉션하십시오. 이는 스트림의 .pipe() 기능을 사용하여 수행 할 수 있습니다.

나는 이미 스트림 개체에 대한 표준 이벤트입니다 .on('data').on('end')를 사용 당신이 아마존 S3를 조회하는 데 사용하는 라이브러리, 스트림을 반환 가정합니다. 여기

당신이 그것을 할 수있는 방법은 다음과 같습니다

app.get('/test', function (req, res) { 
    client.getFile('guitarists/cAtiPkr.jpg', function(err, imageStream) { 
     imageStream.pipe(res); 
    }); 
}); 

파이프를 사용하여, 우리는 클라이언트에 직접 S3하기위한 요청의 출력을 리디렉션합니다. S3에 대한 요청이 닫히면 자동으로 res 급행을 종료합니다.

스트림에 대한 자세한 내용은 substack의 우수 Stream Handbook을 참조하십시오.

추신 : 코드 조각에 res이라는 두 개의 변수가 있습니다. 내부 변수는 외부 변수를 숨겨서 버그를 찾기 어렵습니다.

+0

감사합니다! 바로 일했다. 고객에게 직접? 완전한!! – coiso

+1

서버가 실제 요청을하지만 결과를 파일에 저장하지 않고 출력을 직접 클라이언트 소켓에 씁니다. 이것은 매우 효율적이며 깔끔한 최적화가 가능합니다. 핵심 스트리밍 메커니즘에 대한 개요는 스트림 핸드북을 참조하십시오. –

+0

여러 이미지를 스트리밍 할 때이 방법을 어떻게 적용 할 수 있습니까? 예를 들어 Facebook과 같은 사용자의 새로운 피드에 많은 이미지를 스트리밍합니다. – c0mrade

6

(전체 버킷이 아닌 키 단위로) 액세스 제어를 올바르게 설정하면 <img src="http://aws.amazon.com/myBucket/myKey/moreKey.jpg"> (또는 us-east-1 이외의 다른 도메인을 사용하는 경우 다른 적절한 도메인을 사용할 수 있습니다.) html로 이미지를 표시하고자 할 때마다. 다른 사람이 이미지를 열 때 이미지를 첨부 파일로 다운로드하는 대신 브라우저에서 이미지를 표시하게하려면 MIME 유형을 설정해야합니다.

aws-sdk docs
s3: PUT Object docs

var AWS = require('aws-sdk'); 
AWS.config.update({ 
    accessKeyId: "something", 
    secretAccessKey: "something else", 
    region:'us-east-1', 
    sslEnabled: true, 
}); 
var fileStream = fs.createReadStream(filename); 
s3.putObject({ 
    Bucket:'myBucket', 
    Key: 'myKey/moreKey.jpg', 
    Body: fileStream, 
    ContentType:'image/jpeg', 
    ACL: 'public-read', 
}, function(err, data){ 
    if(err){ return callback(err) }; 
    console.log('Uploaded '+key); 
    callback(null); 
}); 
관련 문제