2016-08-25 2 views
0

Ich kopiere Dateien von Kameras, um sie in einer Cordova App (unter Android) auf S3 hochzuladen. Zur Zeit lade ich die Datei in das Cache-Verzeichnis (ich würde lieber streamen, aber ich konnte nicht herausfinden, wie das geht)Cordova Hochladen von Dateien nach S3

Ich kann eine kleine Test-Textdatei erstellen und lade das keine Probleme, also ich weiß, dass ein Teil funktioniert. Es ist nur ein Bild oder eine Videodatei bekommen und das Hochladen von dem, was ich mit großen Problemen habe,

function downloadFileToLocalStorage(fileName, url, callback){ 

window.resolveLocalFileSystemURL(cordova.file.cacheDirectory, function(dir) { 

var name = dir.nativeURL + fileName; 
var fileTransfer = new FileTransfer(); 
var uri = encodeURI(url); 

fileTransfer.download(
    uri, name, function (entry) { 
    callback(entry); 
    }, 
    function (error) {console.log(error);}, 
    false, { 
    headers: { 
     "Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA==" 
    } 
    } 
); 

}); 

} 

Dann las ich die Datei und laden

function uploadAsset(fileEntry,callback) { 

fileEntry.file(function(file) { 

var reader = new FileReader(); 
reader.onloadend = function (evt) { 
// var theBody = btoa(evt.target._result) (8mb file); 
var theBody = this.result// (6mb file); 

    var bucket = new AWS.S3({params: {Bucket: 'video-processing'}}); 
    var opts = {queueSize: 2, partSize: 1024 * 1024 * 10}; 
    var params = {Key: file.name, ContentType: file.type, Body: theBody, opts}; 

    bucket.upload(params,opts, function (err, data) { 
    if(data)callback(data); 
    }).on('httpUploadProgress', function(evt) { 
    console.log('Progress:',evt,formatBytes(evt.loaded),formatBytes(evt.total), parseInt(evt.loaded/evt.total * 100) + "%"); 
    }); 
}; 
reader.readAsDataURL(file); 
}) 
} 

Dies scheint zu funktionieren, aber es sind ein paar Probleme:

  • Die angegebene Upload-Größe evt.total ist fast doppelt so groß wie die ursprüngliche Dateigröße (4 MB), nehme ich an, weil ich es in einen Blob lese. Sollte ich etwas anderes machen? Ich habe versucht, die gelesene Datei direkt hochzuladen.
  • Es Timeout, bevor es endet, es scheint zu 28-30% zu kommen dann auf 16% fallen, dann bis zu 25% und es bleibt dort für eine Weile und dann Auszeiten.
  • Hier ist ein Beispiel für die Spur, normalerweise wird es auf etwa 30-40% vor dem Zurückfallen auf 11, kommt wieder hoch und fällt dann. Sehr frustrierend!

    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 917504, totalSize: 6171107, lengthComputable: true, loaded: 917504…} 6.171 MB 6.171 MB 14% 
    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 1146880, totalSize: 6171107, lengthComputable: true, loaded: 1146880…} 6.171 MB 6.171 MB 18% 
    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 1359872, totalSize: 6171107, lengthComputable: true, loaded: 1359872…} 6.171 MB 6.171 MB 22% 
    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 1589248, totalSize: 6171107, lengthComputable: true, loaded: 1589248…} 6.171 MB 6.171 MB 25% 
    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 1818624, totalSize: 6171107, lengthComputable: true, loaded: 1818624…} 6.171 MB 6.171 MB 29% 
    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 2048000, totalSize: 6171107, lengthComputable: true, loaded: 2048000…} 6.171 MB 6.171 MB 33% 
    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 2277376, totalSize: 6171107, lengthComputable: true, loaded: 2277376…} 6.171 MB 6.171 MB 36% 
    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 2277376, totalSize: 6171107, lengthComputable: true, loaded: 2277376…} 6.171 MB 6.171 MB 36% 
    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 688128, totalSize: 6171107, lengthComputable: true, loaded: 688128…} 6.171 MB 6.171 MB 11% 
    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 917504, totalSize: 6171107, lengthComputable: true, loaded: 917504…} 6.171 MB 6.171 MB 14% 
    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 1146880, totalSize: 6171107, lengthComputable: true, loaded: 1146880…} 6.171 MB 6.171 MB 18% 
    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 1359872, totalSize: 6171107, lengthComputable: true, loaded: 1359872…} 6.171 MB 6.171 MB 22% 
    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 1359872, totalSize: 6171107, lengthComputable: true, loaded: 1359872…} 6.171 MB 6.171 MB 22% 
    awsController.js:43 Progress: XMLHttpRequestProgressEvent {isTrusted: true, position: 688128, totalSize: 6171107, lengthComputable: true, loaded: 688128…} 6.171 MB 6.171 MB 11% 
    awsController.js:38 Error: Timeout(…) 
    

    Ein weiteres Beispiel

    Antwort

    0

    I 1 den Timeout auf 0 und die Warteschlangengröße einzustellen musste zu fixieren

    var bucket = new AWS.S3({ 
        apiVersion: '2006-03-01', 
        httpOptions: {timeout: 0} 
        }); 
    
        var params = { 
        Bucket: 'bucket-name', 
        Key: file.name, 
        ContentEncoding: 'base64', 
        ContentType: file.type, 
        Body: theBody 
        }; 
    
        var opts = { 
        queueSize: 1, 
        partSize: 1024 * 1024 * 10 
        }; 
    
    Verwandte Themen