2014-06-15 2 views
1

사진을 업로드하고 저장하는 데 Amazon S3 Bucket과 함께 Meteor.js를 사용하고 있습니다. 나는 운 석 packs collectionFS와 aws-s3을 사용하고 있습니다. 내 aws-s3 연결을 올바르게 설정 했으므로 이미지 컬렉션이 제대로 작동합니다.CollectionFS 및 cfs-s3 유성 패키지를 사용하여 AWS S3 Bucket 업로드

클라이언트 측 이벤트 핸들러 :

 'click .submit': function(evt, templ) { 
     var user = Meteor.user(); 
     var photoFile = $('#photoInput').get(0).files[0]; 

     if(photoFile){ 

     var readPhoto = new FileReader(); 

     readPhoto.onload = function(event) { 
      photodata = event.target.result; 
      console.log("calling method"); 
      Meteor.call('uploadPhoto', photodata, user); 
     }; 
     } 

그리고 내 서버 측 방법 :

'uploadPhoto': function uploadPhoto(photodata, user) { 

     var tag = Random.id([10] + "jpg"); 
     var photoObj = new FS.File({name: tag}); 
     photoObj.attachData(photodata); 
     console.log("s3 method called"); 

     Images.insert(photoObj, function (err, fileObj) { 
     if(err){ 
      console.log(err, err.stack) 
     }else{ 
      console.log(fileObj._id); 
     } 
     }); 

선택 파일은 .JPG 이미지 파일 만 업로드에 내가 서버에이 오류가 메소드 :

'uploadPhoto'메소드를 호출하는 중 예외 오류 : DataMan 생성자가 지원하지 않는 데이터를 수신했습니다.

이미지 파일을 직접 전달하거나 데이터로 첨부하거나 fileReader를 사용하여 text/binary/string으로 읽을 수 있습니다. 나는 아직도 그 오류를 얻는다. 제발 조언.

+0

삽입 클라이언트를 만들고 싶지 않은 이유가 있습니까? – chaosbohne

+0

아마도 AWS 자격 증명 (키 + 비밀)을 안전하게 유지하고 클라이언트에 제공하지 않는 것은 잘못된 접근입니다. 또한 양동이에 업로드를 허용하기 전에 서버 측면에서 특정 유효성 검사를 수행하려고합니다. 덕분에 – zakir2k

답변

2

네, 어쩌면 생각합니다. 몇 달 전에 collectionFS를 사용하여 작업을 했으므로 docs에주의를 기울여야합니다. 예를 들어 100 % 정확하지 않을 수 있습니다.

자격 증명은 환경 변수를 통해 설정해야합니다. 따라서 키와 비밀은 서버에서만 사용할 수 있습니다. 더 읽을 거리를 보려면 link을 확인하십시오.

먼저, 나를 위해 일하는 몇 가지 예제 코드가 있습니다. 차이점을 확인하십시오.

템플릿 도우미 :

'dropped #dropzone': function(event, template) { 
    addImage(event); 
} 

기능 addImage :

function addImagePreview(event) { 
    //Go throw each file, 
    FS.Utility.eachFile(event, function(file) {  

    //Some Validationchecks 
    var reader = new FileReader(); 

    reader.onload = (function(theFile) { 
     return function(e) { 

     var fsFile = new FS.File(image.src); 

     //setMetadata, that is validated in collection 
     //just own user can update/remove fsFile 
     fsFile.metadata = {owner: Meteor.userId()};   

     PostImages.insert(fsFile, function (err, fileObj) { 
      if(err) { 
      console.log(err); 
      } 
     });   
     }; 
    })(file); 

    // Read in the image file as a data URL. 
    reader.readAsDataURL(file);   
    }); 
} 

좋아, 다음 포인트는 검증이다. 유효성 검사는 허용/거부 규칙 및 FS.Collection의 필터를 사용하여 수행 할 수 있습니다. 이렇게하면 모든 유효성 검사를 수행하고 클라이언트를 통해 삽입 할 수 있습니다.

예 : 다른 예를 click

을 찾을 여기

PostImages = new FS.Collection('profileImages', { 
    stores: [profileImagesStore], 
    filter: { 
    maxSize: 3145728, 
    allow: { 
     contentTypes: ['image/*'], 
     extensions: ['png', 'PNG', 'jpg', 'JPG', 'jpeg', 'JPEG'] 
    } 
    }, 
    onInvalid: function(message) { 
    console.log(message); 
    } 
}); 


PostImages.allow({ 
    insert: function(userId, doc) { 
    return (userId && doc.metadata.owner === userId); 
    }, 
    update: function(userId, doc, fieldNames, modifier) { 
    return (userId === doc.metadata.owner); 
    }, 
    remove: function(userId, doc) { 
    return false; 
    }, 
    download: function(userId) { 
    return true; 
    }, 
    fetch: [] 
}); 

오류의 또 다른 점은 어쩌면 당신의 AWS 구성입니다. 쓰여진 것처럼 다 했니? here?

이 게시물 click에 따르면 FS.File()이 올바르게 구성되지 않은 경우이 오류가 발생하는 것으로 보입니다. 어쩌면 이것은 당신이 시작하는 첫 번째 방법이되어야합니다.

많은 도움이되기를 바랍니다.

+0

. 이 일을 그냥 처리하고 있습니다. 환경 변수가 확실히 작동합니다. – zakir2k

+0

이것이 작동합니다 - 유일한 문제는 contentType이 S3로 업로드 할 때 application/octet-stream으로 다시 돌아가는 것 같습니다. FS.File의 형식이 명확하게 image/jpeg 또는 image/png이지만. – zakir2k