我在离子v2应用中将输入文件对象转换为Base64时遇到问题。特别是在使用onload / onloadend阅读器时会出现这个问题,因为它偶尔会被调用(最稀有的最稀有的非常具体)。
当用户点击触发attachFile函数的图像文件时,我能够获取文件名,大小和对象,但在此之后,当我使用FileReader将文件对象转换为Base64时 - onload或onloadend,回调函数很少被调用,文件对象不会因此而转换为Base64。
文件输入:
<input #fileInput type="file" accept="image/*" (change)="attachFile($event)">
附加档案
attachFile(fileInput: any)
{
let fileList: FileList = fileInput.target.files;
// I can access the selected file name, size and object correctly without any issues
console.log("File name = " + fileList[0].name);
console.log("File size = " + fileList[0].size);
console.log("File = " + fileList[0]);
// Converting the file input to base 64 (This rarely works)
this.convertFileToBase64AndSet(fileList);
}
Base64转换:
convertFileToBase64AndSet(fileList: FileList)
{
if(fileList.length > 0)
{
var reader = new FileReader();
reader.onloadend = (e: Event) => {
console.log(reader.result);
}
reader.readAsDataURL(fileList[0]);
}
}
我可以理解这是否完全不起作用,但是有一些罕见的情况会调用onload / onloadend回调并成功将对象转换为Android手机中的Base64。
所以这给我留下了很少的选择,我无法为角度2找到一个像样的Base64转换插件,因为大多数插件都是针对旧角度的。
一个角度的插件很有希望 - angular-base64-upload但是我无法弄清楚如何在角度2中运行它,因为指令专门针对旧的角度。
当然必须有办法达到这个要求,任何线索都会受到高度赞赏。
我的要求也是这样,Base64转换插件不应该依赖于任何文件路径,而应该直接转换从用户选择的文件输入中获取的文件对象。
P.S:我已经在stackoverflow中看到了关于FileReader回调的所有答案,到目前为止没有一个对我有用。
答案 0 :(得分:3)
检查一下。 https://plnkr.co/edit/PFfebmnqH0eQR9I92v0G?p=preview
模板
<input type="file" id="filePicker" (change)="handleFileSelect($event)">
组件:
handleFileSelect(evt){
var files = evt.target.files;
var file = files[0];
if (files && file) {
var reader = new FileReader();
reader.onload =this._handleReaderLoaded.bind(this);
reader.readAsBinaryString(file);
}
}
_handleReaderLoaded(readerEvt) {
var binaryString = readerEvt.target.result;
this.base64textString= btoa(binaryString);
console.log(btoa(binaryString));
}
修改: 关于这在Mobile中不起作用,似乎已知离子问题。 https://github.com/driftyco/ionic-native/issues/505
你可以尝试的事情
在cordova.js修复之前加载zone.js.
特定于ionic2 维持这个顺序。
<script src="build/polyfills.js"></script>
<script src="cordova.js"</script>
,因为polyfills.js执行zone.js。
答案 1 :(得分:1)
当我尝试上一个解决方案时,基础64还没有完成 html部分
<input type="file" class="form-control input-lg" #fileInput type="file" accept="image/*" (change)="conImage($event)" name="Image"/>
组件方
conImage(input) :void{
//this.profileService.conImage().subscribe(convertimage => this.convertimage = convertimage);
if (input.target.files && input.target.files[0]) {
var reader = new FileReader();
//data = data.replace(/['"]+/g, '');
//$('#imageupload').attr('src', e.target.result);
reader.onload = function (e) {
console.log(e.target.result)
//console.log(e)
};
reader.readAsDataURL(input.target.files[0]);
}
}
console.log输出提供完整的base64代码,当你将base64放在图像的src中时,你将获得图像