使用 JavaScript 解压缩文件
Uncompress a file with JavaScript
我需要将 json 文件加载到 Javascript 容器中。在用户的浏览器上,json 文件被加载到处理数据的 Javascript 库中。但是,这个文件变得非常大 (10MB),但如果我压缩它,我可以将它压缩到 100KB。
因此我想压缩服务器上的文件,使用 ajax 下载它,解压并加载到我的 javascript 容器中。
生成 zip 文件很容易。我正在努力的是下载文件并解压缩它。我找到了一个名为 zip.js 的库。我以他们为榜样,但我就是无法让它发挥作用。我认为我加载文件的方式不正确。
这是我目前拥有的:
var file_data = $.ajax({
url: "/path/to/file.zip",
async: false
}).responseText;
zip.createReader(new zip.TextReader(file_data), function(reader) {
// get all entries from the zip
reader.getEntries(function(entries) {
if (entries.length) {
// get first entry content as text
entries[0].getData(new zip.TextWriter(), function(text) {
// text contains the entry data as a String
console.log(text);
// close the zip reader
reader.close(function() {
// onclose callback
});
}, function(current, total) {
// onprogress callback
});
}
});
}, function(error) {
// onerror callback
console.log(error);
});
我得到的错误是:
File format is not recognized.
我也试过 BlobReader 但没有成功,HttpReader class 对我不起作用,我得到
zip.HttpReader is not a constructor
这就是你做错的地方
var file_data = $.ajax({
url: "/path/to/file.zip",
async: false
}).responseText;
- 首先,异步是一种不好的做法,已弃用,不要使用它
- 其次:jQuery 的 ajax 不能很好地处理二进制文件。它总是希望将所有内容都视为字符串,这将导致二进制文件被浏览器解析和转换
你不希望这样。您的 zip 数据将被损坏
您应该按原样使用 xhr.responseType = 'blob'
检索原始二进制文件
或使用新的提取 api
fetch('file.zip').then(res => res.blob()).then(unzipBlob)
所以忘了jQuery...
如果你想要同步的感觉,那么你应该使用 async/await + promises 这只适用于 Blink (chrome/opera) 你也可以使用 babel
async function downlaod() {
let res = await fetch(file)
let file_data = await res.blob()
// and so on...
}
我需要将 json 文件加载到 Javascript 容器中。在用户的浏览器上,json 文件被加载到处理数据的 Javascript 库中。但是,这个文件变得非常大 (10MB),但如果我压缩它,我可以将它压缩到 100KB。
因此我想压缩服务器上的文件,使用 ajax 下载它,解压并加载到我的 javascript 容器中。
生成 zip 文件很容易。我正在努力的是下载文件并解压缩它。我找到了一个名为 zip.js 的库。我以他们为榜样,但我就是无法让它发挥作用。我认为我加载文件的方式不正确。
这是我目前拥有的:
var file_data = $.ajax({
url: "/path/to/file.zip",
async: false
}).responseText;
zip.createReader(new zip.TextReader(file_data), function(reader) {
// get all entries from the zip
reader.getEntries(function(entries) {
if (entries.length) {
// get first entry content as text
entries[0].getData(new zip.TextWriter(), function(text) {
// text contains the entry data as a String
console.log(text);
// close the zip reader
reader.close(function() {
// onclose callback
});
}, function(current, total) {
// onprogress callback
});
}
});
}, function(error) {
// onerror callback
console.log(error);
});
我得到的错误是:
File format is not recognized.
我也试过 BlobReader 但没有成功,HttpReader class 对我不起作用,我得到
zip.HttpReader is not a constructor
这就是你做错的地方
var file_data = $.ajax({
url: "/path/to/file.zip",
async: false
}).responseText;
- 首先,异步是一种不好的做法,已弃用,不要使用它
- 其次:jQuery 的 ajax 不能很好地处理二进制文件。它总是希望将所有内容都视为字符串,这将导致二进制文件被浏览器解析和转换
你不希望这样。您的 zip 数据将被损坏
您应该按原样使用 xhr.responseType = 'blob'
或使用新的提取 api
fetch('file.zip').then(res => res.blob()).then(unzipBlob)
所以忘了jQuery...
如果你想要同步的感觉,那么你应该使用 async/await + promises 这只适用于 Blink (chrome/opera) 你也可以使用 babel
async function downlaod() {
let res = await fetch(file)
let file_data = await res.blob()
// and so on...
}