2016-12-01 22 views
1

我正試圖在Android設備上寫入20MB blob文件。此代碼工作正常4-5MB左右,但崩潰的大文件。使用cordova writefile 20MB blob崩潰(Android)

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

有沒有辦法來處理更大的斑點?謝謝。清單中已有android:largeHeap="true"

的logcat的錯誤:

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

哪裏是這個特殊的blob來自何方,有沒有爲什麼你需要使用文件API來保存它的理由? (如果我正在下載文件,我會使用文件傳輸。) –

+0

是的 - 我很樂意使用文件傳輸。數據是在內存中創建的一個blob,它將來自服務器的多個文件組合在一起(blob是一個動畫gif)。我試圖將blob轉換爲blob:url(URL.createObjectURL(blob);)但fileTransfer不喜歡它。 – user1361529

+0

服務器無法執行組合並向您發送最終結果(您可以使用FileTransfer)的任何原因?或者,這個應用程序就像GIF創建者,需要在本地構建GIF? –

回答

1

的解決方案,經過實驗就是要打破寫成大塊 - 這似乎適用於我迄今爲止測試過的20-30MB文件。

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); 
        }); 
      } 


    } 

信用:@Andre Werlang幫我這個位置:https://stackoverflow.com/a/40935231/1361529

+0

嘿我使用你的代碼是工作在一些手機用戶精下載任何大小的文件,並在一些手機顯示500內部服務器eror無法找到文件:/ /隨機名。文件正在從服務器下載,但寫入文件系統有一些問題的功能任何想法如何處理? – arun

+0

@arun同樣的問題在這裏。你有沒有找到任何解決方法?發生在我將我的ArrayBuffer下載文件包裝到Blob中時顯然有一個請求發生在像blob:file:/// 0ba95f93-ac5d-4110-9dbc-c4661756cdfa之類的地方,並且出現500錯誤,說「DOMException:請求的文件不能閱讀,通常是由於權限問題....「 – Juri

+0

@Juri昨天問題仍然存在。我正在使用cordova傳輸文件,而不是寫入文件。所以它正在與轉移。 – arun

0

這是我使用,我沒有限制或尚未達到其

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

謝謝我現在就給它 - 我應該將writeFile轉換爲返回一個承諾? – user1361529

+0

我會說試試這個,因爲它是第一個測試出來,然後如果它工作混亂 – Eric

+0

問題 是否有必要將__data轉換爲文本/普通blob?在我的情況下,輸入是一個blob(但圖像/ gif) – user1361529