为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蛊毒传说 2023-07-14 09:48:22
我正在尝试使用 HTML2Canvas 和 CordovaExternalDirectory 将 Base64 图像写入设备存储中。图像文件已创建,但已损坏。当我使用 BlobUrl 函数打开 blob 图像时,它在新窗口中工作正常。注意: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);            });        });    });}当我使用 Bloburl 在新窗口中打开时 - 输出在此处但是写入图像文件后,这是结果
查看完整描述

1 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

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


爪哇


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];

    }

}

脚本语言


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


查看完整回答
反对 回复 2023-07-14
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信