【发布时间】:2017-05-02 05:20:12
【问题描述】:
出于学习目的,我想使用 html 输入标签来选择 jpeg 图像,检索文件对象,使用 fileReader 加载它并使用检索到的图像字符串 (base64) 创建一个新的 blob/文件。
该服务可以上传从输入检索到的原始文件就好了。但是,使用我的 newFile 文件会损坏,并且文件大小会变大。
我认为我的 blob 构造函数有问题?
我在打字稿中使用 angular2
<input type="file" (change)="onFileChanged($event)">
onFileChanged(event){
if (event.target.files && event.target.files[0]) {
let file = event.target.files[0];
let newFile;
let fr = new FileReader();
fr.onload = (event:any)=>{
let base64 = event.target.result
let img = base64.split(',')[1]
let blob = new Blob([window.atob(img)],{type:'image/jpeg'})
newFile = this.blobToFile(blob,'test')
}
fr.readAsDataURL(file)
console.log(file)
console.log(newFile)
this.service.upload(newFile).subscribe()
}
}
blobToFile(blob: Blob, fileName: string): File {
let b: any = blob;
b.lastModified = moment.now();
b.lastModifiedDate = new Date();
b.name = fileName;
b.webkitRelativePath="";
return <File>blob
}
编辑------------ 在发现 fileReader 是异步的后,我对其进行了一些调整,确实问题出在 blob 构造函数上。 登录原始文件和新文件的 target.result 显示 base64 已被转换。任何想法为什么?
if (event.target.files && event.target.files[0]) {
let file = event.target.files[0];
let base64: string = null;
if (/^image\//.test(file.type)) {
let reader = new FileReader();
reader.onload = (e: any) => {
console.log(e.target)
base64 = e.target.result
let img = base64.split(',')[1];
let blob = new Blob([img], { type: 'image/jpeg' })
console.log(blob);
let fr = new FileReader()
fr.onload = (event: any) => {
console.log(event.target)
}
fr.readAsDataURL(blob)
}
reader.readAsDataURL(file);
}
【问题讨论】:
-
event.target.result是否返回 base64 编码的字符串或二进制数据? -
返回类似这样的数据:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAIBAQEBAQIBAQECAg...
-
代码看起来正确。您的意思是上传后在服务器上还是在 Angular 应用程序中损坏了?您如何“使用”它,是什么让您相信它已损坏?
-
好吧,当我上传后下载它时,它说文件已损坏并且无法打开...基本上,如果我只是从输入上传原始文件,一切正常。如果我上传我创建的 Blob/文件,当我下载它时文件已损坏
标签: javascript angular typescript