2016-12-01 1 views
1

Ich versuche, ein 20MB Blob in Datei auf einem Android-Gerät zu schreiben. Dieser Code funktioniert für 4-5 MB oder so gut, stürzt aber bei größeren Dateien ab.Mit cordova WriteFile für einen 20MB Blob stürzt ab (Android)

tp = cordova.file.dataDirectory; // for Android $cordovaFile.writeFile(tp, "temp-file.gif", blob,true);

ist es eine Möglichkeit, größere Blobs zu handhaben? Vielen Dank. Ich habe bereits android:largeHeap="true" im Manifest.

der logcat Fehler:

E/JavaBinder( 809): !!! FAILED BINDER TRANSACTION !!! 
I/art  ( 809): Background sticky concurrent mark sweep GC freed 62202(4MB) AllocSpace objects, 96(3MB) LOS objects, 20% free, 25MB/31MB, paused 20.488ms total 176.243ms 
E/JavaBinder( 809): !!! FAILED BINDER TRANSACTION !!! 
W/ActivityManager( 809): Exception thrown during pause 
W/ActivityManager( 809): android.os.TransactionTooLargeException 
W/ActivityManager( 809): at android.os.BinderProxy.transactNative(Native Method) 
W/ActivityManager( 809): at android.os.BinderProxy.transact(Binder.java:496) 
W/ActivityManager( 809): at android.app.ApplicationThreadProxy.schedulePauseActivity(ApplicationThreadNative.java:711) 
W/ActivityManager( 809): at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:829) 
W/ActivityManager( 809): at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2749) 
W/ActivityManager( 809): at com.android.server.am.ActivityStack.finishTopRunningActivityLocked(ActivityStack.java:2606) 
W/ActivityManager( 809): at com.android.server.am.ActivityStackSupervisor.finishTopRunningActivityLocked(ActivityStackSupervisor.java:2544) 
W/ActivityManager( 809): at com.android.server.am.ActivityManagerService.handleAppCrashLocked(ActivityManagerService.java:11721) 
W/ActivityManager( 809): at com.android.server.am.ActivityManagerService.makeAppCrashingLocked(ActivityManagerService.java:11618) 
W/ActivityManager( 809): at com.android.server.am.ActivityManagerService.crashApplication(ActivityManagerService.java:12330) 
W/ActivityManager( 809): at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:11819) 
W/ActivityManager( 809): at com.android.server.am.NativeCrashListener$NativeCrashReporter.run(NativeCrashListener.java:86) 
+0

Wo ist diese besondere blob kommen, und gibt es einen Grund, warum Sie benötigen die Datei-API zu verwenden, um es zu retten? (Wenn ich eine Datei herunterlade, verwende ich stattdessen die Dateiübertragung.) –

+0

Yup - Ich würde gerne die Dateiübertragung verwenden. Die Daten sind ein Blob, der im Speicher erstellt wird und mehrere Dateien vom Server kombiniert (der Blob ist ein animiertes GIF). Ich habe versucht, das Blob in ein Blob zu konvertieren: url (URL.createObjectURL (blob);) aber fileTransfer mag es nicht. – user1361529

+0

Gibt es einen Grund, warum der Server die Kombination nicht ausführen kann und Ihnen das Endergebnis senden kann (welches Sie mit FileTransfer verwenden könnten)? Oder ist diese App so etwas wie ein GIF-Ersteller, der das GIF lokal erstellen muss? –

Antwort

1

Die Lösung erreicht, nach dem Experimentieren der Schreib aufzubrechen ist in Chunks - das scheint für 20-30MB Dateien zu funktionieren, die ich bisher getestet habe.

function writeFile2(path, file, blob, isAppend) 
    { 
     var csize = 4 * 1024 * 1024; // 4MB 
     var d = $q.defer(); 
     NVRDataModel.debug ("Inside writeFile2 with blob size="+blob.size); 

     // nothing more to write, so all good? 
     if (!blob.size) 
     { 
      NVRDataModel.debug ("writeFile2 all done"); 
      d.resolve(true); 
      return $q.resolve(true); 
     } 


     if (!isAppend) 
      { 
       // return the delegated promise, even if it fails 
       return $cordovaFile.writeFile(path, file, blob.slice(0,csize), true) 
        .then (function (succ) { 
         return writeFile2(path,file,blob.slice(csize),true); 
        }); 
      } 
      else 
      { 
       // return the delegated promise, even if it fails 
       return $cordovaFile.writeExistingFile(path, file, blob.slice(0,csize)) 
        .then (function (succ) { 
         return writeFile2(path,file,blob.slice(csize),true); 
        }); 
      } 


    } 

Credit: @Andre Werlang half mir dies mit hier: https://stackoverflow.com/a/40935231/1361529

+0

Hey Benutzer ich Ihren Code verwende es funktioniert in einigen Handys fein Herunterladen von Dateien beliebiger Größe und in einigen Handys zeigt es 500 interne Server Eror kann nicht finden Datei: // zufälliger Name. Datei wird vom Server heruntergeladen, aber das Schreiben in das Dateisystem hat ein Problem in Funktion jede Idee, wie Sie umgehen? – arun

+0

@arun Das gleiche Problem hier. Hast du einen Workaround gefunden? passiert, wenn ich meine ArrayBuffer heruntergeladene Datei in einen Blob wickle, anscheinend wird eine Anfrage an etwas wie blob gemacht: file: /// 0ba95f93-ac5d-4110-9dbc-c4661756cdfa, das mit einem Fehler 500 fehlschlägt, der sagt "DOMException: angeforderte Datei konnte nicht sein gelesen, in der Regel aufgrund von Berechtigungsproblemen .... " – Juri

+0

@Juri gestern Problem ist immer noch vorhanden. Ich benutze Übertragungsdatei in Cordova, anstatt Datei zu schreiben. Es funktioniert also mit dem Transfer. – arun

0

Das ist, was ich benutze, und ich habe keine Grenze oder haben es nicht

function writeFile(__filename, __data){ 
     window.resolveLocalFileSystemURL(cordova.file.dataDirectory, function(dir){ 
      dir.getFile(__filename, {create:true}, function(file){    
       file.createWriter(function(fileWriter){ 
        var blob = new Blob([__data], {type:'text/plain'}); 
        fileWriter.write(blob); 

       });      
      }); 
     }); 
    }; 
+0

Danke, ich werde es jetzt versuchen - sollte ich writeFile in die Rückgabe eines Versprechens konvertieren? – user1361529

+0

Ich würde sagen, versuchen Sie es so, wie es ist, es zuerst zu testen, dann damit zu verfahren, wenn es funktioniert – Eric

+0

Frage ist es notwendig, __data in einen Text/Plain Blob zu konvertieren? in meinem Fall ist die Eingabe ein Blob (aber Bild/GIF) – user1361529