所以,我正在尝试使用AngularJS在前端和NodeJS在后端编写CSV文件导入器。
我的问题是,我不确定传入的CSV文件的编码方式。有没有一种自动检测它的方法?
我首先尝试使用FileReader.readAsDataURL()在Node中进行检测。但是文件内容将被Base64编码,因此我无法这样做(当我解码文件时,我已经需要知道编码方式)。 如果我使用FileReader.readAsText(),我也需要事先知道编码方式。但是,在初始化FileReader之前也无法这样做,因为实际文件对象似乎不包括文件内容。
我的当前代码:
我首先尝试使用FileReader.readAsDataURL()在Node中进行检测。但是文件内容将被Base64编码,因此我无法这样做(当我解码文件时,我已经需要知道编码方式)。 如果我使用FileReader.readAsText(),我也需要事先知道编码方式。但是,在初始化FileReader之前也无法这样做,因为实际文件对象似乎不包括文件内容。
我的当前代码:
generateFile = function(file){
reader = new FileReader();
reader.onload = function (evt) {
if (checkSize(file.size) && isTypeValid(file.type)) {
scope.$apply(function () {
scope.file = evt.target.result;
file.encoding = Encoding.detect(scope.file);
if (angular.isString(scope.fileName)) {
return scope.fileName = name;
}
});
if (form) {
form.$setDirty();
}
scope.fileArray.push({
name: file.name,
type: file.type,
size: file.size,
date: file.lastModified,
encoding: file.encoding,
file: scope.file
});
--scope.pending;
if (scope.pending === 0){
scope.$emit('file-dropzone-drop-event', scope.fileArray);
scope.fileArray = [];
}
}
};
let fileExtExpression = /\.csv+$/i;
if(fileExtExpression.test(file.name)){
reader.readAsText(file);
}
else{
reader.readAsDataURL(file);
}
++scope.pending;
}
这个问题是不是完全无法解决?或者我做错了什么?我甚至尝试使用FileReader.readAsArrayBuffer()来解决这个问题,并从中提取文件头,但这对我来说太过复杂,或者似乎并没有起作用。