我正在使用 javascript zip.js图书馆。我到处搜索,但找不到将多个文件添加到 zip 的示例。
这是我的代码,但它生成了一个“损坏的”zip。
var len = results.rows.length, i;
var k=1;
zip.createWriter(new zip.BlobWriter(), function(writer) {
for (i = 0; i < len; i++){
// get the image url from a sqlite request
url = results.rows.item(i).url;
var img = new Image();
img.onload = function() {
var a = document.createElement('a');
a.href = this.src;
var filename= a.pathname.split('/').pop(); // filename.php
timest = new Date().getTime();
// use a TextReader to read the String to add
writer.add(timest+".jpg", new zip.Data64URIReader(getBase64Image(img)), function() {
// onsuccess callback
k++;
if(k==len){
setTimeout(function(){
writer.close(function(blob) {
// blob contains the zip file as a Blob object
$('#test').attr("href", window.URL.createObjectURL(blob));
$('#test').attr("download", "woeii.zip");
});
},1000);
}
}, function(currentIndex, totalIndex) {
// onprogress callback
});
};
img.src = url;
}
});
有什么让它发挥作用的想法吗? :)
最佳答案
如果您正在寻找处理多个文件的代码示例,see here .然后你可以 view the source code .
这是演示的主要来源(略有修改):
var obj = this;
var model = (function() {
var zipFileEntry, zipWriter, writer, creationMethod, URL = obj.webkitURL || obj.mozURL || obj.URL;
return {
setCreationMethod : function(method) {
creationMethod = method;
},
addFiles : function addFiles(files, oninit, onadd, onprogress, onend) {
var addIndex = 0;
function nextFile() {
var file = files[addIndex];
onadd(file);
// Modified here to use the Data64URIReader instead of BlobReader
zipWriter.add(file.name, new zip.Data64URIReader(file.data), function() {
addIndex++;
if (addIndex < files.length)
nextFile();
else
onend();
}, onprogress);
}
function createZipWriter() {
zip.createWriter(writer, function(writer) {
zipWriter = writer;
oninit();
nextFile();
}, onerror);
}
if (zipWriter)
nextFile();
else if (creationMethod == "Blob") {
writer = new zip.BlobWriter();
createZipWriter();
} else {
createTempFile(function(fileEntry) {
zipFileEntry = fileEntry;
writer = new zip.FileWriter(zipFileEntry);
createZipWriter();
});
}
},
getBlobURL : function(callback) {
zipWriter.close(function(blob) {
var blobURL = creationMethod == "Blob" ? URL.createObjectURL(blob) : zipFileEntry.toURL();
callback(blobURL);
zipWriter = null;
});
},
getBlob : function(callback) {
zipWriter.close(callback);
}
};
})();
用法:
假设 <a id="downloadLink">Download</a>
元素存在以在准备就绪后提供下载。
// Prepare your images
var files = [];
for (i = 0; i < len; i++) {
// Get the image URL from a SQLite request
var url = results.rows.item(i).url;
(function(url){
var img = new Image();
img.onload = function() {
// Add to file array [{name, data}]
var a = document.createElement('a');
a.href = this.src;
var filename= a.pathname.split('/').pop();
console.log("Loaded file " + filename);
files.push({name: filename, data: getBase64Image(img) });
}
img.src = url;
})(url);
}
// Wait for the image to load
var check = setInterval(function(){
if(files.length==images.length) {
clearInterval(check);
// Set the mode
model.setCreationMethod("Blob");
// Add the files to the zip
model.addFiles(files,
function() {
// Initialise Method
console.log("Initialise");
}, function(file) {
// OnAdd
console.log("Added file");
}, function(current, total) {
// OnProgress
console.log("%s %s", current, total);
}, function() {
// OnEnd
// The zip is ready prepare download link
// <a id="downloadLink" href="blob:url">Download Zip</a>
model.getBlobURL(function(url) {
document.getElementById("downloadLink").href = url;
document.getElementById("downloadLink").style.display = "block";
document.getElementById("downloadLink").download = "filename.zip";
});
});
}
}, 500);
您可以使用示例源代码添加进度指示器。 希望这会有所帮助,这种方法的好处是,如果您将其设为自己的 JS 文件,则 zip 模型很容易重用。
另一个想法:我假设你正在使用 getBase64Image
函数 from here ,如果是这样并且您仍然遇到损坏问题,也许尝试将返回修改为简单的 return dataURL;
并注释掉 .replace(...
, 作为 Data64URIReader
可能需要前缀。
关于zip - 如何使用 zip.js 将多个文件添加到一个 zip 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17510979/
UPDATEDDEMO工作得很好,除了当我改变时背景图像正在调整大小:background-size:20px20px;是否可以保持原图大小,让背景图重叠(隐藏图片超出左上框(20px20px)的部分)?B计划是在设置的base64图像内容中用JS裁剪图像... 最佳答案 使用只有左边框和上边框的svg图像可能就是您要找的东西?检查片段,或这个jsfiddle(fiddle包含放大/缩小网格的按钮):body{background:url('http://testbed.nicon.nl/img/_FBs3b.svg')repeat
我正在使用Angular-ui弹出一个带有表单的模式。我的代码是:app.controller('NewCaseModalCtrl',['$http','$scope','$modal',function($http,$scope,$modal,$log){$scope.items=['item1','item2','item3'];$scope.open=function(size){varmodalInstance=$modal.open({templateUrl:'modal-new-case.html',controller:'ModalInstanceCtrl',size:s
我有一个将内容动态输出到元素的提要。我想从元素A中获取文本并将其输出到控制台日志。例子:ID5667控制台输出:编号:ID5667我已经尝试了一些方法,但要么是未定义的,要么是该元素的完整HTML。 最佳答案 我认为下面的内容应该适合您。varresult=document.getElementsByClassName("elementa")[0].innerHTML;console.log(result);更多引用:getElementByClassName 关于javascript-
我是Protractor的新手,我正在尝试测试弹出事件,这是我的代码:describe('popoverdirective',function(){varbuttons=element.all(by.tagName('button'));it('shouldshowthepopovertitlebyclicking',function(){varpopTitle="testTitle";varpopContent="testContent";element(by.model('title')).clear().sendKeys(popTitle);element(by.model('c
阅读这篇文章后,我正在尝试使用npm作为任务运行器/构建工具:Howtousenpmasabuildtool虽然我取得了一些成功,但我仍然坚持一件事。当运行JSLINT、JSHINT或ESLINT等命令行全局工具时,npm将始终在控制台窗口中显示Exit1代码:如您所见,该命令运行良好,但npm将其视为错误并显示错误日志信息。这是否正常和/或是否有针对特定命令将其关闭的方法?附加信息:这是我的package.json配置中的脚本block:“脚本”:{“开始”:“Node./src/server/index.js”,“测试”:””,“lint”:“eslintindex.js”然后在n
假设我有两个observable,如果另一个符合特定条件,我想监听一个observable的变化。我用zip尝试过,但似乎只有当bothobservables发生变化时,我才会收到通知,但如果条件另一个是正确的。我尝试过的:varfirstState=newRx.BehaviorSubject(undefined);varsecondState=newRx.BehaviorSubject(undefined);Rx.Observable.zip(firstState,secondState,function(first,second){return{first:first,second
我想忘记“jQuery”因为我喜欢“AngularJS”。但是,我需要知道如何使用在我的应用程序的其他地方合并AngularJS的独立任务。例如,这次我想使用“$httpsAngularJS”函数导入一个JavaScript文件。示例(它曾经在jQuery中执行):$.get("url.js",function(data){eval(data)});//okconsole.info($.get);//codecodecode...ok示例(在AngularJS中记录)//InacontrollerApp.controller('Ctrllr',['$http',function($ht
我正在构建一个有两个View的应用:主页和View列表当用户在主页View上点击列表名称时,它应该更改为“View列表”模板。我添加了一个名为“view”的session变量,在启动时将其设置为“home”。当在主屏幕上的其中一项(列表名称)上检测到单击事件时,它将View的值更改为“viewList”。然后在HTML中,如果“view”是“home”,我有一个if语句来显示home模板,否则显示“viewList”模板。我可以看出第一部分是有效的,因为我正在输出“view”的值,并且当您单击列表名称时它会输出值“viewList”,只是不会更改模板。我错过了什么?我的代码:我的列表.
我正在构建一个使用var创建Level对象的JavaScript游戏:functionstart(){varmyGameLevel=newLevel(2);}这个Level对象有很多功能,主要是向DOM添加元素并使它们具有交互性。一个简化:functionLevel(i){var_difficulty=i;this.init=function(){jQuery("#container").append(...gameelementshere...);jQuery("#button").on('click',function(){...});}}我的问题:我如何知道在start函数中创建
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭7年前。Improvethisquestion我正在构建一个googlechrome扩展程序,我正在右侧(在我的friend故事中)做一些工作,实际上,我正在搜索一个特定的friend故事,其名称在点击后出现在输入元素中按钮。我需要在搜索时将出现在图片黑色边框中的所有其他元素变暗/变暗,直到他按下X按钮为止除了一个元素之外,我不知道如何访问所有其他元素!!:(图片: