使用 Cordova 插件写入 Blob 图像失败 [ Android ]

Writing the Blob Image using Cordova plugin getting failed [ Android ]

我正在尝试使用 HTML2Canvas 和 Cordova ExternalDirectory 将 Base64 图像写入设备存储。

图像文件已创建,但已损坏。当我使用 BlobUrl 函数打开 blob 图像时,它在新的 window.

中工作正常

注意:在 Android Manifest

中添加了所需的权限

下面的示例代码

var blobUrl;
    function customB64toBlob(b64Data) {
        console.log(" ----- b64Data ----");
        var parts = b64Data.split(";");
        var contentType = parts[0].split(":")[1];
        var realData = parts[1].split(",")[1];
        console.log(parts);
        console.log("Real data");
        contentType = contentType || '';
        sliceSize = 512;
        var byteCharacters = atob(realData);
        var byteArrays = [];

        for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
            var slice = byteCharacters.slice(offset, offset + sliceSize);

            var byteNumbers = new Array(slice.length);
            for (var i = 0; i < slice.length; i++) {
                byteNumbers[i] = slice.charCodeAt(i);
            }

            var byteArray = new Uint8Array(byteNumbers);

            byteArrays.push(byteArray);
        }

      var blob = new Blob(byteArrays, {type: contentType});
      blobUrl = URL.createObjectURL(blob);
      console.log(blob);
      return blob;
}

function savebase64AsImageFile(folderpath,filename,content){
    // Convert the base64 string in a Blob
    var dataBlob = customB64toBlob(content);
    console.log(" ----- Writing file ----");
    window.resolveLocalFileSystemURL(folderpath, function(dir) {
        console.log("Access to the directory granted succesfully");
        dir.getFile(filename, {create:true}, function(file) {
            console.log("File created succesfully.");
            file.createWriter(function(fileWriter) {
                console.log("Writing content to file");
                fileWriter.write(dataBlob);
            }, function(){
                alert('Unable to save file in path '+ folderpath);
            });
        });
    });
}

this.savebase64AsImageFile(cordova.file.externalDataDirectory, 'Test.png', base64Canvas);
window.open(blobUrl);

当我使用 Bloburl 在新 window 中打开时 - 在此处输出

但是写入镜像文件后,结果是这样

我为 cordova 中的 Android 和 IOS 创建了一个单独的插件,用于将文件 [Native level] 保存到设备中。我觉得现有的文件编写器插件有问题

JAVA

private Boolean saveImage(final CallbackContext callbackContext, final String bs64String) {
    cordova.getThreadPool().execute(new SocialSharingRunnable(callbackContext) {
      public void run() {
        //Directory and File
        try {
          String dirName = webView.getContext().getExternalFilesDir(null) + "/";
          File dir = new File(dirName);
          File file = new File(dirName, cordova.getActivity().getApplicationContext().getString(R.string.filename)+".png");
          Log.d("SaveFile", "Save Image");
          Log.d("SaveFile", "dirName  "+dirName);
          //Avoid overwriting a file
       /*   if (!overwrite && file.exists()) {
              callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, "File already exists!"));
          }*/

          //Decode Base64 back to Binary format
          byte[] decodedBytes = Base64.decode(bs64String.getBytes(), Base64.DEFAULT);

          //Save Binary file to phone
          file.createNewFile();
          FileOutputStream fOut = new FileOutputStream(file);
          fOut.write(decodedBytes);
          fOut.close();
          callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, "Saved successfully!"));
        } catch (FileNotFoundException e) {
          callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, "File not Found!"));
        } catch (IOException e) {
          callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, e.getMessage()));
        }
      }
    });
    return true;
  }

IOS

- (void)saveImage:(CDVInvokedUrlCommand*)command {
    CDVPluginResult *pluginResult;
    @try
    {
        NSLog(@"========== saveImage ========");
        NSString* strBase64Img = [command.arguments objectAtIndex:0];
        NSLog(@"strBase64Img %@",strBase64Img);
        NSData *imageData = [Sharing dataFromBase64String:strBase64Img];
        UIImage *image = [UIImage imageWithData:imageData];
        
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
        NSLog(@"paths %@",paths);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSLog(@"documentsDirectory %@",documentsDirectory);
        NSString *getImagePath = [documentsDirectory stringByAppendingPathComponent:@"ImageName.png"];
        [UIImagePNGRepresentation(image) writeToFile:getImagePath atomically:YES];
        
        NSString *savedImage = @"Successfully saved";
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:savedImage];
        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
    }
    @catch(id anException) {
        NSString *failImg = @"Failed to Save";
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:failImg];
        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
    }
}

JAVA脚本

   cordova.exec(onSaveSuccess, onSaveError, "Sharing", "saveImage", [base64Canvas]);