我想创建包含我从后端接收的压缩文件的.zip文件,然后将此文件发送给用户.2天我一直在寻找答案,无法找到合适的解决方案,也许你可以帮助我:)
现在,代码是这样的:(我知道我不应该在spring控制器中完成所有操作,但不关心它,它只是为了测试目的,找到让它工作的方法)
@RequestMapping(value = "/zip")
public byte[] zipFiles(HttpServletResponse response) throws IOException{
//setting headers
response.setContentType("application/zip");
response.setStatus(HttpServletResponse.SC_OK);
response.addHeader("Content-Disposition", "attachment; filename=\"test.zip\"");
//creating byteArray stream, make it bufforable and passing this buffor to ZipOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(byteArrayOutputStream);
ZipOutputStream zipOutputStream = new ZipOutputStream(bufferedOutputStream);
//simple file list, just for tests
ArrayList<File> files = new ArrayList<>(2);
files.add(new File("README.md"));
//packing files
for (File file : files) {
//new zip entry and copying inputstream with file to zipOutputStream, after all closing …Run Code Online (Sandbox Code Playgroud) 我试图从a读取一个文件java.util.zip.ZipInputStream,并将其复制到一个java.io.ByteArrayOutputStream(这样我就可以创建一个java.io.ByteArrayInputStream并将其交给第三方库,最终关闭流,我不希望我ZipInputStream关闭) .
我可能在这里遗漏了一些基本内容,但我从未在这里输入while循环:
ByteArrayOutputStream streamBuilder = new ByteArrayOutputStream();
int bytesRead;
byte[] tempBuffer = new byte[8192*2];
try {
while ((bytesRead = zipStream.read(tempBuffer)) != -1) {
streamBuilder.write(tempBuffer, 0, bytesRead);
}
} catch (IOException e) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我错过了哪些可以让我复制流?
编辑:
我之前应该提到这ZipInputStream不是来自文件,所以我认为我不能使用ZipFile.它来自通过servlet上传的文件.
此外,我已经调用getNextEntry()了ZipInputStream之前获取此代码片段.如果我不尝试将文件复制到另一个文件中InputStream(通过OutputStream上面提到的),并且只是将文件传递ZipInputStream给我的第三方库,那么库将关闭流,而我无法做更多的事情,比如处理剩下的文件流.
我正在尝试读取一个zip文件,检查它是否有一些必需的文件,然后将所有有效文件写入另一个zip文件.java.util.zip的基本介绍有很多Java主义,我很想让我的代码更加Scala-native.具体来说,我想避免使用vars.这就是我所拥有的:
val fos = new FileOutputStream("new.zip");
val zipOut = new ZipOutputStream(new BufferedOutputStream(fos));
while (zipIn.available == 1) {
val entry = zipIn.getNextEntry
if (entryIsValid(entry)) {
zipOut.putNewEntry(new ZipEntry("subdir/" + entry.getName())
// read data into the data Array
var data = Array[Byte](1024)
var count = zipIn.read(data, 0, 1024)
while (count != -1) {
zipOut.write(data, 0, count)
count = zipIn.read(data, 0, 1024)
}
}
zipIn.close
}
zipOut.close
Run Code Online (Sandbox Code Playgroud)
我应该补充说我正在使用Scala 2.7.7.
我如何正确地将字节压缩到a ByteArrayOutputStream然后使用ByteArrayInputStream?读取?我有以下方法:
private byte[] getZippedBytes(final String fileName, final byte[] input) throws Exception {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zipOut = new ZipOutputStream(bos);
ZipEntry entry = new ZipEntry(fileName);
entry.setSize(input.length);
zipOut.putNextEntry(entry);
zipOut.write(input, 0, input.length);
zipOut.closeEntry();
zipOut.close();
//Turn right around and unzip what we just zipped
ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(bos.toByteArray()));
while((entry = zipIn.getNextEntry()) != null) {
assert entry.getSize() >= 0;
}
return bos.toByteArray();
}
Run Code Online (Sandbox Code Playgroud)
当我执行此代码时,底部的断言失败,因为entry.size是-1.我不明白为什么提取的实体与压缩的实体不匹配.
java zip bytearrayoutputstream bytearrayinputstream zipoutputstream
我现在有这个问题.我想在此XSSFWorkbook(工作簿)obj中将excel文件保存写入zip文件,例如(包含此example.xlsx文件的example.zip)到远程服务器.我试过以下但没有工作,它创建了一个包含zip文件中一些奇怪文件的文件夹
XSSFWorkbook workbook = new XSSFWorkbook();
//add some data
Zipoutputstream zipstream=new Zipoutputstream(//destination outputstream);
workbook.write(zipstream);
Run Code Online (Sandbox Code Playgroud)
那么有谁知道这样做的正确方法是什么?提前致谢
ps workbook.write(fileoutputstream)可以工作,但它只能作为一个平面文件写入本地磁盘,例如test.xlsx而不是我需要的zip内部.
我正在尝试创建多个图像文件的zip文件.我已成功创建所有图像的zip文件,但不知何故所有图像都被挂起到950字节.我不知道这里出了什么问题现在我无法打开图像被压缩成那个zip文件.
这是我的代码.任何人都可以让我知道这里发生了什么?
String path="c:\\windows\\twain32";
File f=new File(path);
f.mkdir();
File x=new File("e:\\test");
x.mkdir();
byte []b;
String zipFile="e:\\test\\test.zip";
FileOutputStream fout=new FileOutputStream(zipFile);
ZipOutputStream zout=new ZipOutputStream(new BufferedOutputStream(fout));
File []s=f.listFiles();
for(int i=0;i<s.length;i++)
{
b=new byte[(int)s[i].length()];
FileInputStream fin=new FileInputStream(s[i]);
zout.putNextEntry(new ZipEntry(s[i].getName()));
int length;
while((length=fin.read())>0)
{
zout.write(b,0,length);
}
zout.closeEntry();
fin.close();
}
zout.close();
Run Code Online (Sandbox Code Playgroud) 我想用Windows压缩Windows(7)上的文件ZipOutputStream.问题是文件名(以及文件文件Content)也包含希腊字符(" ??0000660040140521_a.txt",Gamma和Pi).压缩我使用的文件的代码:
ZipOutputStream zipOs = new ZipOutputStream(
new FileOutputStream("c:\\temp\\test.zip"), Charset.forName("cp737")
);
File sourceFile = new File("C:/Path/To/File/??0000660040140521_b.txt");
String entryName = sourceFile.getName().replaceAll("\\\\", "/");
ZipEntry entry = new ZipEntry(entryName);
zipOs.putNextEntry(entry);
...
...
Run Code Online (Sandbox Code Playgroud)
但是在最后一行(putNextEntry通话)我得到了IllegalArgumentException:
java.lang.IllegalArgumentException: UNMAPPABLE[1]
at java.util.zip.ZipCoder.getBytes(ZipCoder.java:95)
at java.util.zip.ZipOutputStream.writeLOC(ZipOutputStream.java:407)
at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:221)
Run Code Online (Sandbox Code Playgroud)
我假设希腊语和UTF-8之间的字符映射一定有什么问题...什么是在文件名中用希腊字符压缩文件的正确方法?
编辑
如果我使用"utf-8"作为字符集,则可以创建zip文件,但压缩文件的名称是错误的:" ðôðƒ0000660040140521_a.txt"(希腊字符丢失)
我需要从S3下载照片(不在同一目录中),将其压缩,然后再次使用AWS S3 Java SDK上传到S3。该zip文件大小可以以GB为单位。目前,我正在使用AWS Lambda,它的临时存储限制为最大500 MB。因此,我不想将ZIP文件保存在磁盘上,而是想将ZIP文件(使用从S3下载的照片动态创建的ZIP文件)直接传输到S3。我需要使用AWS S3 Java SDK。
考虑将单个文件test_file.pdf放入zip存档test.zip然后读取此存档的代码示例:
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class Main {
public static void main(String[] args) {
File infile = new File("test_file.pdf");
try (
FileInputStream fis = new FileInputStream(infile);
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("test.zip"));
) {
int bytesRead;
byte[] buffer = new byte[1024];
ZipEntry entry = new ZipEntry("data");
entry.setSize(infile.length());
zos.putNextEntry(entry);
while ((bytesRead = fis.read(buffer)) >= 0)
{
zos.write(buffer, 0, bytesRead);
}
zos.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
try (
ZipInputStream zis …Run Code Online (Sandbox Code Playgroud) 在我的申请中,没有特定投标的文件(pdf).我需要从那些pdf文件创建一个zip文件,并允许用户下载它.
应用程序在JavaEE中使用struts和mysql完成.当用户单击下载按钮时,将调用此操作类.该代码不提供任何例外,但它也不会提示用户下载任何内容.
请帮我找到代码中的错误.
以下是我的动作类的源代码..
public class ActDownloadDocZip extends Action {
static Logger logger = Logger.getLogger(ActDownloadDocZip.class);
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String realPath = getServlet().getServletContext().getRealPath(
"/WEB-INF/log4jConfiguration.xml");
DOMConfigurator.configure(realPath);
logger.info("In ActDownloadDocZip....");
ActionForward forward = null;
HttpSession session = request.getSession();
// get a db connection
Connection conn = null;
String[][] nameFile = null;
String tenderNo = "";
try {
conn = ProxoolConnection.getProxoolConnectionSLT();
tenderNo = request.getParameter("tenderNo");
// File fileex=new File("xxx.zip");
FileOutputStream zipFile = new FileOutputStream(new File("xxx.zip"));
ZipOutputStream …Run Code Online (Sandbox Code Playgroud) zipoutputstream ×10
java ×9
zip ×3
amazon-s3 ×1
apache-poi ×1
aws-java-sdk ×1
aws-lambda ×1
file ×1
immutability ×1
java-8 ×1
rest ×1
scala ×1
spring ×1
zipfile ×1