使用 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]);
我正在尝试使用 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]);