2014-04-13 5 views
2

내 애플리케이션에서 파일을 다운로드하려면 링크를 제공해야하며, 링크는 숨겨져 있어야하며 권한이없는 사용자가 액세스 할 수 있어야합니다. 그래서 파일을 서버 디렉토리에 보관하는 아이디어를 생각해 냈습니다. Angular.js가 ng-click="download()"으로 $ HTTP 요청을 보낼 파일 ID와 함께 express.js로 보내고, 사용자 ID/pwd로 보냅니다. 우선이 방법이 안전한 솔루션입니까? 둘째, 여기에 작동하지 않는 내 코드입니다,이 오류는 전혀 없지만, 난 다운로드 대화 상자가 열립니다 얻을 수 없습니다Express.js의 Angular.js에서 파일 다운로드

클라이언트 측

$scope.download=function(){ 
$http({method:'GET', url:'/download/'+image[0]['_id']}). 
    success(function(data, status, headers, config) {   
    var element = angular.element('<a/>'); 
    element.attr({ 
     href: 'data:attachment/csv;charset=utf-8,' + encodeURI(data), 
     target: '_blank', 
     download:'test.csv' 
    })[0].click(); 
    }). 
    error(function(data, status, headers, config) { 
    }); 
    } 

서버 측

app.namespace('/download/:documentID*', function() { 

app.all('/', function(req, res, next){ 
    res.download('images/download/test.tif', 'test.tif', function(err){ 
    if (err) { 
    } else { 
    next(); 
     } 
    }); 
    }); 
}) 

답변

2

마지막으로 아약스를 통해 다운로드를 실행할 수 없음을 확인했습니다. ;-)

예를 들어 <a>을 만들어야합니다. target="_blank" 새 탭/창에서 열립니다. 귀하의 인증에 대해 모르겠지만, 나는 일반 텍스트로 보내지 않을 것입니다. Ajax 요청의 자격 증명을 검사하여이를 해결하고 새 탭/창을 열어 일종의 일회용 토큰을 사용하여 파일을 다운로드 할 수 있습니다. 서버 측에서 변경해야 할 부분이 있습니다.

+0

이것은 템플릿의 html 코드입니다 :'Download'은 정확하지 않습니까? – Cris69

+0

@ Cris69 모르겠다. 나는 각도에 있지 않다. 기본적으로 그렇습니다. 그러나 당신은 아무것도하지 않을 것입니다. 'href'는 비어 있고 당신은 여전히 ​​콜백을 호출하여 다운로드합니다. 당신은 ajax 호출을 제거하고'href'를 동적으로 재 작성 할 수 있습니다. 이거, 너를 가야 해. – nietonfir

+1

당신은'$ http' 요청이 불필요한 것이고, 간단한 ''이면 충분합니다. – Cris69