在 javascript 中创建文件时大小为 0
getting size 0 when creating a File in javascript
我正在尝试根据从 Ionic 中的相机插件获得的一些 base64 数据创建一个文件。我正在使用从另一个 Whosebug 的答案中获得的函数。
问题是创建的文件大小为:0,名称 属性 似乎是我在创建时传递的 Uint8array。
这是转换Base64数据的函数:(前两行被注释,因为数据没有"data:image/jpeg;base64,"开头)
_dataURLtoFile(dataurl, filename) {
let //arr = dataurl.split(','),
//mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(dataurl),
n = bstr.length,
u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, {type:'image/jpeg'});
}
这是我在控制台中得到的:
File {name: Array(1), localURL: "archivo", type: {…}, lastModified: null, lastModifiedDate: null, …}
end: 0
lastModified: null
lastModifiedDate: null
localURL: "archivo"
name: [Uint8Array(268175)]
size: 0
start: 0
type: {type: "image/jpeg"}
__proto__: Object
根据对 File
已被覆盖的问题的评论,我修改了函数以使用 Blob
而不是 File
,然后它将生成一个 File
来自那个。
出于演示目的,我还用另一个函数覆盖了默认值 File
。我还让它在 DOM 中输出文件以显示它已加载正确的数据。
window.File = () => 'brokenfilefunction'
function dataURLtoFile(dataurl, filename) {
let bstr = atob(dataurl),
n = bstr.length,
u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
// Something has overwritten File, so you can't use it
// return new File([u8arr], filename, {type:'image/jpeg'});
// Adding the blob to FormData converts it to an actual file
const formData = new FormData();
const blob = new Blob([u8arr], { type: 'image/jpeg' });
formData.append(filename, blob);
// Instead of getting the file, you could just send the formdata object in your request
const actualFile = formData.entries().next().value[1];
return actualFile;
}
const image = 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';
const file = dataURLtoFile(image, 'name');
console.log(file);
// Display image in dom for demo
const fr = new FileReader();
fr.onload = function () {
document.getElementById('image').src = fr.result;
}
fr.readAsDataURL(file);
File has correctly been initialized to red dot:
<img id="image" style="width: 10px; height: 10px;" />
我正在尝试根据从 Ionic 中的相机插件获得的一些 base64 数据创建一个文件。我正在使用从另一个 Whosebug 的答案中获得的函数。 问题是创建的文件大小为:0,名称 属性 似乎是我在创建时传递的 Uint8array。
这是转换Base64数据的函数:(前两行被注释,因为数据没有"data:image/jpeg;base64,"开头)
_dataURLtoFile(dataurl, filename) {
let //arr = dataurl.split(','),
//mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(dataurl),
n = bstr.length,
u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, {type:'image/jpeg'});
}
这是我在控制台中得到的:
File {name: Array(1), localURL: "archivo", type: {…}, lastModified: null, lastModifiedDate: null, …}
end: 0
lastModified: null
lastModifiedDate: null
localURL: "archivo"
name: [Uint8Array(268175)]
size: 0
start: 0
type: {type: "image/jpeg"}
__proto__: Object
根据对 File
已被覆盖的问题的评论,我修改了函数以使用 Blob
而不是 File
,然后它将生成一个 File
来自那个。
出于演示目的,我还用另一个函数覆盖了默认值 File
。我还让它在 DOM 中输出文件以显示它已加载正确的数据。
window.File = () => 'brokenfilefunction'
function dataURLtoFile(dataurl, filename) {
let bstr = atob(dataurl),
n = bstr.length,
u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
// Something has overwritten File, so you can't use it
// return new File([u8arr], filename, {type:'image/jpeg'});
// Adding the blob to FormData converts it to an actual file
const formData = new FormData();
const blob = new Blob([u8arr], { type: 'image/jpeg' });
formData.append(filename, blob);
// Instead of getting the file, you could just send the formdata object in your request
const actualFile = formData.entries().next().value[1];
return actualFile;
}
const image = 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';
const file = dataURLtoFile(image, 'name');
console.log(file);
// Display image in dom for demo
const fr = new FileReader();
fr.onload = function () {
document.getElementById('image').src = fr.result;
}
fr.readAsDataURL(file);
File has correctly been initialized to red dot:
<img id="image" style="width: 10px; height: 10px;" />