cordova-plugin-file icon indicating copy to clipboard operation
cordova-plugin-file copied to clipboard

File created for android are always empty

Open lucabro81 opened this issue 6 years ago • 5 comments

I described the issue here: https://stackoverflow.com/q/51969064/1619070

When I try to write a file with a correct blob nothing happen, I can see the file created but is empty and no error or exception or success event is fired

these are the function I've used

class FileHelper {

    public file:File;

    constructor() {
        this.file = new File();
    }

    public save(filename:string, dir:string, data:any):Promise<any> {

        console.log("FileHelper.save filename", filename);
        console.log("FileHelper.save dir", dir);
        console.log("FileHelper.save data", data);

        return this.file
                   .resolveDirectoryUrl(this.file.cacheDirectory)
                   .then((dir:DirectoryEntry) => {
                       this.onResolveDirectoryUrlSuccess(dir, filename, data, this.fileWriter, {
                           create: true,
                           exclusive: false
                       })
                   })
                   .catch((error:any) => {
                       console.log("FileHelper.save error", dir, filename, error);
                   });
    }

    private onResolveDirectoryUrlSuccess(dir:DirectoryEntry,
                                         filename:string,
                                         data:LanguageDataResponseVO,
                                         file_action:(args:Array<any>) => void,
                                         flags:any):void {
        console.log("FileHelper.onResolveDirectoryUrlSuccess", dir, filename);
        this.gotFileSystem(dir, filename, file_action, flags, data);
    }

    private gotFileSystem(dir:DirectoryEntry,
                          filename:string,
                          action:Function,
                          flags:{ create:boolean, exclusive?:boolean },
                          json?:LanguageDataResponseVO):void {

        console.log('FileHelper.gotFileSystem - nome file: ' + filename);

        dir.getFile(filename, flags,
            (fileEntry) => {
                console.log("FileHelper.gotFileSystem getFile succes", dir, filename, fileEntry);
                action.call(this, [fileEntry, json]);
            },
            (error) => {
                console.log("FileHelper.gotFileSystem getFile error", dir, filename, error);
            }
        );
    }

    private fileWriter(args:Array<any>) {

        console.log('App.LanguageService.fileWriter');

        let fileEntry:FileEntry = args[0];
        let json:string = args[1];

        let blob = new Blob(["text to save"], {type: 'text/plain'});

        fileEntry.createWriter(
            (file:any) => {
                console.log('App.LanguageService.SUCCESS', blob);

                file.onwritestart = (event: ProgressEvent) => {
                    console.log('FileHelper.fileWriter onwritestart - success file_name', fileEntry.name, event);
                };
                /**
                 * Handler for progress events.
                 */
                file.onprogress = (event: ProgressEvent) => {
                    console.log('FileHelper.fileWriter onprogress - success file_name', fileEntry.name, event);
                };
                /**
                 * Handler for write events.
                 */
                file.onwrite = (event: ProgressEvent) => {
                    console.log('FileHelper.fileWriter onwrite - success file_name', fileEntry.name, event);
                };
                /**
                 * Handler for abort events.
                 */
                file.onabort = (event: ProgressEvent) => {
                    console.log('FileHelper.fileWriter onabort - success file_name', fileEntry.name, event);
                };
                /**
                 * Handler for error events.
                 */
                file.onerror = (event: ProgressEvent) => {
                    console.log('FileHelper.fileWriter onerror - success file_name', fileEntry.name, event);
                };
                /**
                 * Handler for write end events.
                 */
                file.onwriteend = (event: ProgressEvent) => {
                    console.log('FileHelper.fileWriter onwriteend - success file_name', fileEntry.name, event);
                };

                file.write(blob);
            },
            (error) => {
                console.log('App.LanguageService.FAIL', error);            }
        );
    }

}

This is android behaviour, under iOS everything works correctly

lucabro81 avatar Aug 22 '18 14:08 lucabro81

+1. It is happening to me on android 7.0

jondediego avatar Nov 29 '18 09:11 jondediego

+1. Happens on Android Pie to.

@lucabro81 Did you find any work around?

ThePatzen avatar Mar 25 '19 05:03 ThePatzen

+1

jemliF avatar Sep 19 '19 21:09 jemliF

If the file writer events aren't firing, then I would guess that the code is stopping anywheres between dir.getFile and calling the file.write api.

If the particular blob you are writing is rather large, it may take some time because blobs needs to be base64 encoded to pass the cordova bridge. (native-webview communication).

breautek avatar Aug 06 '20 09:08 breautek

Hi @lucabro81 , did you find the solution? The ticket is old but still open.

sanjivkamate avatar Oct 18 '20 06:10 sanjivkamate

Closing as stale, and the issue is not reproducible for me. If the issue persists, please create a new issue so that we can have more relevant/updated information.

breautek avatar Dec 19 '22 03:12 breautek