JavaScript实现文件夹压缩及图片处理

需积分: 35 6 下载量 144 浏览量 更新于2024-09-10 收藏 3KB TXT 举报
"JavaScript实现压缩文件夹,图片浏览和下载功能" 在JavaScript中实现压缩文件夹通常涉及到浏览器的限制,因为JavaScript在客户端运行时没有直接访问文件系统的权限。但是,可以借助于一些库或者Web API(如HTML5的File API)来实现文件的读取、操作和发送到服务器进行压缩。以下是一个简化的步骤,描述如何用JavaScript处理文件和图片: 1. **文件API**: HTML5的File API允许JavaScript读取用户选择的文件。通过`<input type="file">`元素,用户可以选择文件,然后使用`FileReader`对象读取这些文件的内容。 2. **读取文件**: 使用`FileReader`的`readAsDataURL`方法将文件内容转换为Base64编码的字符串,这样可以在浏览器中显示图片或用于发送到服务器。 3. **遍历文件**: 类似于代码中的`Loadimg`函数,可以通过循环遍历文件夹中的所有文件,尤其是针对图片类型的文件(例如:gif, jpg, jpeg, bmp)。 4. **图片预览**: 将Base64编码的图片数据设置为`<img>`标签的`src`属性,可以实现图片的预览。例如: ```javascript document.getElementById('img1').src = "data:image/*;base64," + base64ImageString; ``` 5. **图片下载**: 若要提供图片下载,可以创建一个隐藏的`a`标签,设置其`href`为Base64编码的图片数据,并触发点击事件,如下: ```javascript var aLink = document.createElement('a'); aLink.href = "data:image/*;base64," + base64ImageString; aLink.download = 'image.jpg'; aLink.click(); ``` 6. **压缩**: 对于文件夹压缩,JavaScript本身不支持,但可以借助服务器端的语言(如Node.js的zlib库或PHP的gzcompress函数)来实现。JavaScript可以将文件上传到服务器,然后调用服务器接口进行压缩,最后再将压缩后的文件返回给客户端。 7. **AJAX通信**: 使用XMLHttpRequest或fetch API将文件数据发送到服务器,接收服务器响应的压缩文件。这涉及到跨域请求的问题,需要确保服务器端设置正确的CORS策略。 8. **安全考虑**: 访问用户文件系统需得到用户的明确许可,避免隐私泄露和安全风险。使用`<input type="file">`时,用户应只能选择他们想要操作的文件。 9. **异步处理**: 大文件操作可能需要使用Promise或async/await处理异步,防止浏览器阻塞。 10. **性能优化**: 对大量图片进行操作时,考虑分批处理或使用Web Workers以提高性能。 需要注意的是,以上所述的JavaScript操作仅限于用户已经选择的文件,对于文件夹级别的操作,仍需借助服务器端的支持。在实际项目中,可能需要结合Web Workers、Blob对象、FileList以及服务器端的配合来实现完整的文件压缩功能。
2011-04-24 上传
由Douglas Crockford创建的JSMin是一个筛选程序,用于JavaScript文件中删除注释和不必要的空格。这个程序通常能够使文件大小减半,从而节省下载时间。 压缩包里包含了用C写的源码,及可执行程序 由于看到三条评论说没有用,在里我必须说明一下,下面那三个白痴肯定没学过c语言,更没用过c编译好的.exe文件。 以下是c里的源码大家可以先看觉得可用再下 #include <stdlib.h> #include <stdio.h> static int theA; static int theB; static int theLookahead = EOF; /* isAlphanum -- return true if the character is a letter, digit, underscore, dollar sign, or non-ASCII character. */ static int isAlphanum(int c) { return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || c == '_' || c == '$' || c == '\\' || c > 126); } /* get -- return the next character from stdin. Watch out for lookahead. If the character is a control character, translate it to a space or linefeed. */ static int get() { int c = theLookahead; theLookahead = EOF; if (c == EOF) { c = getc(stdin); } if (c >= ' ' || c == '\n' || c == EOF) { return c; } if (c == '\r') { return '\n'; } return ' '; } /* peek -- get the next character without getting it. */ static int peek() { theLookahead = get(); return theLookahead; } /* next -- get the next character, excluding comments. peek() is used to see if a '/' is followed by a '/' or '*'. */ static int next() { int c = get(); if (c == '/') { switch (peek()) { case '/': for (;;) { c = get(); if (c <= '\n') { return c; } } case '*': get(); for (;;) { switch (get()) { case '*': if (peek() == '/') { get(); return ' '; } break; case EOF: fprintf(stderr, "Error: JSMIN Unterminated comment.\n"); exit(1); } } default: return c; } } return c; } /* action -- do something! What you do is determined by the argument: 1 Output A. Copy B to A. Get the next B. 2 Copy B to A. Get the next B. (Delete A). 3 Get the next B. (Delete B). action treats a string as a single character. Wow! action recognizes a regular expression if it is preceded by ( or , or =. */ static void action(int d) { switch (d) { case 1: putc(theA, stdout); case 2: theA = theB; if (theA == '\'' || theA == '"') { for (;;) { putc(theA, stdout); theA = get(); if (theA == theB) { break; } if (theA == '\\') { putc(theA, stdout); theA = get(); } if (theA == EOF) { fprintf(stderr, "Error: JSMIN unterminated string literal."); exit(1); } } } case 3: theB = next(); if (theB == '/' && (theA == '(' || theA == ',' || theA == '=' || theA == ':' || theA == '[' || theA == '!' || theA == '&' || theA == '|' || theA == '?' || theA == '{' || theA == '}' || theA == ';' || theA == '\n')) { putc(theA, stdout); putc(theB, stdout); for (;;) { theA = get(); if (theA == '[') { for (;;) { putc(theA, stdout); theA = get(); if (theA == ']') { break; } if (theA == '\\') { putc(theA, stdout); theA = get(); } if (theA == EOF) { fprintf(stderr, "Error: JSMIN unterminated set in Regular Expression literal.\n"); exit(1); } } } else if (theA == '/') { break; } else if (theA =='\\') { putc(theA, stdout); theA = get(); } if (theA == EOF) { fprintf(stderr, "Error: JSMIN unterminated Regular Expression literal.\n"); exit(1); } putc(theA, stdout); } theB = next(); } } } /* jsmin -- Copy the input to the output, deleting the characters which are insignificant to JavaScript. Comments will be removed. Tabs will be replaced with spaces. Carriage returns will be replaced with linefeeds. Most spaces and linefeeds will be removed. */ static void jsmin() { theA = '\n'; action(3); while (theA != EOF) { switch (theA) { case ' ': if (isAlphanum(theB)) { action(1); } else { action(2); } break; case '\n': switch (theB) { case '{': case '[': case '(': case '+': case '-': action(1); break; case ' ': action(3); break; default: if (isAlphanum(theB)) { action(1); } else { action(2); } } break; default: switch (theB) { case ' ': if (isAlphanum(theA)) { action(1); break; } action(3); break; case '\n': switch (theA) { case '}': case ']': case ')': case '+': case '-': case '"': case '\'': action(1); break; default: if (isAlphanum(theA)) { action(1); } else { action(3); } } break; default: action(1); break; } } } } /* main -- Output any command line arguments as comments and then minify the input. */ extern int main(int argc, char* argv[]) { int i; for (i = 1; i < argc; i += 1) { fprintf(stdout, "// %s\n", argv[i]); } jsmin(); return 0; }