我拥有的最小文件有> 850k行,每行的长度未知.目标是n在浏览器中读取此文件中的行.完全阅读它不会发生.
这是<input type="file" name="file" id="file">我和我的HTML 和JS:
var n = 10;
var reader = new FileReader();
reader.onload = function(progressEvent) {
// Entire file
console.log(this.result);
// By lines
var lines = this.result.split('\n');
for (var line = 0; line < n; line++) {
console.log(lines[line]);
}
};
Run Code Online (Sandbox Code Playgroud)
显然,这里的问题是它试图首先实现整个文件,然后用换行符拆分它.所以无论如何n,它都会尝试读取整个文件,并在文件很大时最终不读取任何内容.
我该怎么办?
注意:我愿意删除整个函数并从头开始,因为我将能够console.log()读到我们读过的每一行.
*"每行都是未知长度" - >表示文件是这样的:
(0, (1, 2))
(1, (4, 5, 6))
(2, (7))
(3, (8))
Run Code Online (Sandbox Code Playgroud)
编辑:
要走的路就像大文件上的filereader api,但我看不出如何修改它来读取n文件的行...
我正在尝试将文件从Angular 4应用程序上传到JSON API服务,该服务接受base64字符串作为文件内容.
所以我所做的是 - 用文件读取FileReader.readAsDataURL,然后当用户确认上传时,我将向API创建一个JSON请求并发送base64我之前获得的文件的字符串.
这就是问题开始的地方 - 只要我对"内容"(记录,发送,w/e)执行某些操作,请求将被发送,但其速度非常慢,例如20MB的2MB文件.
我试过了:
ArrayBuffer并手动将其转换为base64@angular/common但是一切都会导致相同的结果.
我知道问题所在.但为什么会这样呢?是浏览器特定的还是角度特定的?是否有更优选的方法(请记住它必须是base64字符串)?
笔记:
码:
当用户将文件添加到dropzone时,此方法将运行:
public onFileChange(files: File[]) : void {
files.forEach((file: File, index: number) => {
const reader = new FileReader;
// UploadedFile is just a simple model that contains filename, size, type and later base64 content
this.uploadedFiles[index] = new UploadedFile(file);
//region reader.onprogress
reader.onprogress = (event: ProgressEvent) => {
if (event.lengthComputable) …Run Code Online (Sandbox Code Playgroud) 类似于在这个MDN页面上描述的那个,但没有将文件加载到内存中,即我希望能够使用一些流接口以块的形式发送文件,以便我的客户端进程独立于文件大小.使用不可见<input type=file>元素选择文件.
这是一个现实世界的问题:我的用户将一次上传多个文件,这可能足够大(并且客户端设备足够有限)担心内存消耗.与此同时,我想提供一个很好的客户端上传器,其中包含进度指示.
FileReader接口似乎不支持流式传输,除非我当然缺少一些东西.
该解决方案应该可以在最新版本的Safari,Chrome和Firefox中使用,如果可能的话也可以在IE9中使用(尽管可能没什么希望).编辑:也没有jQuery,只是简单的JavaScript.
现在许多浏览器都支持使用HTML5的FileReader读取本地文件,这为超出"数据库前端"的网站打开了大门,这些脚本可以对本地数据执行一些有用的操作,而无需先将其发送到服务器.
在上传前预处理图像和视频,FileReader的一个大应用是将数据从某种磁盘表(CSV,TSV等)加载到浏览器中进行操作 - 可能用于D3.js中的绘图或分析或在WebGL中创建景观.
问题是,StackOverflow和其他站点上的大多数示例都使用FileReader的.readAsText()属性,该属性在返回结果之前将整个文件读入RAM.
要在不将数据加载到RAM的情况下读取文件,需要使用.readAsArrayBuffer(),这个SO帖子是最接近我能得到一个好答案的:
然而,这个特定问题有点过于具体,而且说实话,我可以尝试好几天让解决方案更加通用,然后空手而归,因为我不明白块大小的重要性或为什么Uint8Array是用过的.使用用户可定义的行分隔符逐行读取文件的更一般问题的解决方案(理想情况下使用.split(),因为它也接受正则表达式),然后按行执行某些操作(例如将其打印到console.log)是理想的.
如何上传500mb文件并使用CryptoJS获取MD5哈希?
这是我的代码:
$('#upload-file').change(function(){
var reader = new FileReader();
reader.addEventListener('load',function () {
var hash = CryptoJS.MD5(CryptoJS.enc.Latin1.parse(this.result));
window.md5 = hash.toString(CryptoJS.enc.Hex);
});
reader.readAsBinaryString(this.files[0]);
});
Run Code Online (Sandbox Code Playgroud)
如果文件低于200mb,它可以工作.任何更大的东西,this.result都是空的"".
我试过了:
javascript FileReader - 以块的形式解析长文件
几乎让这个工作,但控制台抱怨.join("")
http://dojo4.com/blog/processing-huge-files-with-an-html5-file-input
javascript ×4
filereader ×3
file-upload ×2
angular ×1
base64 ×1
bigdata ×1
cryptojs ×1
file ×1
html ×1
html5 ×1
io ×1
json ×1
md5 ×1
rest ×1