2017-11-16 3 views
4

사용자가 전화기에서 이미지를 선택하여 AWS S3에 업로드 할 수있는 코드바 앱이 있습니다. 나는 이것을 위해 cordova-plugin-camera과 S3 SDK를 사용하고 있습니다. 나는 잘 작동하는 코드를 가지고 있지만 (아래 참조), base64로 인코딩 된 문자열 (Camera.DestinationType.DATA_URL)과 다시 한번 Buffer에 전체 이미지를 메모리로 가져와야합니다.Cordova 앱에서 서버로 스트림 파일

잠재적 인 메모리 문제를 줄이려면이 장치를 휴대 전화의 하드 드라이브에서 스트리밍하는 것이 좋습니다. cordova-plugin-camera 웹 사이트에도 경고 메시지가 표시됩니다.

/** * 경고 : DATA_URL은 사용하지 않는 것이 좋습니다. DATA_URL 대상 * 유형은 낮은 품질의 설정을 사용하는 경우에도 매우 많은 메모리를 사용합니다. 그것 *을 사용하면 메모리 부족 오류가 발생하고 응용 프로그램이 다운 될 수 있습니다. 대신 FILE_URI * 또는 NATIVE_URI를 사용하십시오. */

그래서 FILE_URI 또는 NATIVE_URI 또는 다른 기술을 사용하여 S3에 디스크에서 바로 사진을 스트리밍 할 수있는 방법은 무엇입니까? 이것은 당신이 시작해야

doTheThing() { 
    let options = { 
     quality: 50, 
     destinationType: Camera.DestinationType.DATA_URL, 
     sourceType: Camera.PictureSourceType.PHOTOLIBRARY, 
     encodingType: Camera.EncodingType.JPG 
    }; 

    navigator.camera.getPicture(imgData => { 
     this.uploadToS3(imgData); 
    }, options); 


    uploadToS3(data) { 
     let AWS = require('aws-sdk'); 

     AWS.config = new AWS.Config(); 
     AWS.config.accessKeyId = 'noway'; 
     AWS.config.secretAccessKey = 'jose'; 
     AWS.config.region = 'us-east-2'; 

     let s3 = new AWS.S3(); 
     let uploadParams = { Bucket: 'iamkule/f1/f2', Key: '', Body: new Buffer(data, 'base64') }; 
     uploadParams.Key = 'myfile.jpg'; 

     s3.upload(uploadParams, function (err, data) { 
      if (data) { 
       console.log('yay!'); 
      } 
     }); 
    } 
} 
+0

파일 업로드 플러그인을 보셨습니까? – Gandhi

+0

@ 간디에 대한 URL을 얻을 수 있습니까? cordova-plugin-file-transfer (https://cordova.apache.org/docs/ko/latest/reference/cordova-plugin-file-transfer)를 의미합니까? – d512

+0

파일 전송 플러그인은 제가 언급 한 것입니다. 업로드 기능이 있습니다. – Gandhi

답변

1

:

여기에 내 현재 코드입니다. 내 의사 코드를 용서해주십시오. 필요에 따라 자유롭게 편집하십시오. 모두 함께 퍼팅

function uploadToS3(blob, callback) { 
    let AWS = require('aws-sdk'); 
    AWS.config = new AWS.Config(); 
    AWS.config.accessKeyId = 'noway'; 
    AWS.config.secretAccessKey = 'jose'; 
    AWS.config.region = 'us-east-2'; 
    let s3 = new AWS.S3(); 
    let options = { Bucket: 'iamkule/f1/f2', Key: 'myfile.jpg', Body: blob };// <-- 
    s3.upload(options, callback); 
} 

:

function getImageAsBlob(url, blobCallback) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", url, true); 
    xhr.responseType = "arraybuffer"; 
    xhr.onload = function(ev) { 
     // Obtain a blob: URL for the image data. 
     var arrayBufferView = new Uint8Array(this.response); 
     var blob = new Blob([ arrayBufferView ], { type: "image/jpeg" }); 
     blobCallback(blob); 
    }; 
    xhr.send(); 
} 

가 S3에 블롭 업로드 :

function takePicture(urlCallback){ 
    let options = { 
     quality: 50, 
     destinationType: Camera.DestinationType.FILE_URI,// <-- 
     sourceType: Camera.PictureSourceType.PHOTOLIBRARY, 
     encodingType: Camera.EncodingType.JPG 
    }; 
    navigator.camera.getPicture(urlCallback, onFail, options); 
    function onFail(message) { 
     alert('Failed because: ' + message); 
    } 
} 

가 BLOB으로 디스크에서 이미지를 가져 오기 :

장치는 디스크에 이미지를 저장 :

takePicture(function(url){ 
    getImageAsBlob(url, function(blob){ 
     uploadToS3(blob, function (err, data) { 
      if (data) console.log('yay!'); 
     }); 
    }); 
}); 

S3 정보는 here에서 왔습니다. 사진 캡처 정보는 here에서 왔습니다. 해피 코딩!

+1

답변 해 주셔서 감사합니다. 'getImageAsBlob()'함수에서 무슨 일이 벌어지고 있는지 이해하는 데 어려움을 겪고 있습니다. 'url' 매개 변수는 전화 상에있는 이미지 파일의 경로 여야합니다. 그러나 당신은 아무것도하지 않고 있습니다. 대신 http : //fiddle.jshell.cnet에서 이미지를 다운로드하고 있습니까? 확실하지 않습니다. – d512

+0

나는 버그를 고쳤다. 이 코드는 테스트가 끝나지 않았지만 게시하기 전에 할 수있는 일을 테스트했습니다. 이 솔루션은 추가 업데이트가 필요할 수 있지만 시작해야합니다. –

+1

흥미로운 점은 XMLHttpRequest를 사용하여 파일 시스템에서 "얻으려고"할 수 있다는 것을 몰랐습니다.그리고 노력의 진가를 인정하는 동안, 이것은 S3까지 디스크에서 파일을 스트리밍하지 않기 때문에 핵심 문제를 해결하지 못합니다. 전체 파일을 메모리에 보관합니다. 당신은 기본 64 바이트 문자열을 없애 버린다. 이것은 훌륭하다. – d512

관련 문제