如何 return 从 Servlet 中的字节数组压缩
How to return zip from bytearray on Servlet
再次使用 Java EE。
例如
- 在 servlet 上我有 byte[] fileContent ---->(file.txt)
- 我尝试将其添加到 zip 文件
将 servlet 设置为
response.setContentType("Content-type: text/zip");
response.setHeader("Content-Disposition",
"attachment; filename=mytest.zip");
// List of files to be downloaded
List files = new ArrayList();
files.add(new File("C:/first.txt"));
ServletOutputStream out = response.getOutputStream();
ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(out));
for (File file : files) {
System.out.println("Adding " + file.getName());
zos.putNextEntry(new ZipEntry(file.getName()));
// Get the file
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
} catch (FileNotFoundException fnfe) {
// If the file does not exists, write an error entry instead of
// file
// contents
zos.write(("ERRORld not find file " + file.getName())
.getBytes());
zos.closeEntry();
System.out.println("Couldfind file "
+ file.getAbsolutePath());
continue;
}
BufferedInputStream fif = new BufferedInputStream(fis);
// Write the contents of the file
int data = 0;
while ((data = fif.read()) != -1) {
zos.write(data);
}
fif.close();
zos.closeEntry();
System.out.println("Finishedng file " + file.getName());
}
zos.close();
}
}
我对第二点有疑问。我尝试了几种解决方案,但所有这些解决方案都无法与我的 servlet 一起使用或无法正常工作。
有人可以举例说明如何将文件作为字节数组添加到 zip 并在 servlet 上添加 return 作为附件吗?感谢任何提示和建议
--post编辑
我尝试了类似的方法,但我怎样才能添加 byte[] 而不是 file。
解决方案示例如下:
public class ZipFileServlet extends HttpServlet {
private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.
private YourFileDAO yourFileDAO = YourDAOFactory.getYourFileDAO();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String[] fileIds = request.getParameterValues("fileId");
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=\"allfiles.zip\"");
ZipOutputStream output = null;
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
try {
output = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE));
for (String fileId : fileIds) {
YourFileItem item = yourFileDAO.find(fileId);
if (item == null) continue; // Handle yourself. The fileId may be wrong/spoofed.
InputStream input = null;
try {
input = new BufferedInputStream(item.getInputStream(), DEFAULT_BUFFER_SIZE);
output.putNextEntry(new ZipEntry(item.getName()));
for (int length = 0; (length = input.read(buffer)) > 0;) {
output.write(buffer, 0, length);
}
output.closeEntry();
} finally {
if (input != null) try { input.close(); } catch (IOException logOrIgnore) { /**/ }
}
}
} finally {
if (output != null) try { output.close(); } catch (IOException logOrIgnore) { /**/ }
}
}
}
再次使用 Java EE。
例如
- 在 servlet 上我有 byte[] fileContent ---->(file.txt)
- 我尝试将其添加到 zip 文件
将 servlet 设置为
response.setContentType("Content-type: text/zip"); response.setHeader("Content-Disposition", "attachment; filename=mytest.zip"); // List of files to be downloaded List files = new ArrayList(); files.add(new File("C:/first.txt")); ServletOutputStream out = response.getOutputStream(); ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(out)); for (File file : files) { System.out.println("Adding " + file.getName()); zos.putNextEntry(new ZipEntry(file.getName())); // Get the file FileInputStream fis = null; try { fis = new FileInputStream(file); } catch (FileNotFoundException fnfe) { // If the file does not exists, write an error entry instead of // file // contents zos.write(("ERRORld not find file " + file.getName()) .getBytes()); zos.closeEntry(); System.out.println("Couldfind file " + file.getAbsolutePath()); continue; } BufferedInputStream fif = new BufferedInputStream(fis); // Write the contents of the file int data = 0; while ((data = fif.read()) != -1) { zos.write(data); } fif.close(); zos.closeEntry(); System.out.println("Finishedng file " + file.getName()); } zos.close();
} }
我对第二点有疑问。我尝试了几种解决方案,但所有这些解决方案都无法与我的 servlet 一起使用或无法正常工作。
有人可以举例说明如何将文件作为字节数组添加到 zip 并在 servlet 上添加 return 作为附件吗?感谢任何提示和建议
--post编辑
我尝试了类似的方法,但我怎样才能添加 byte[] 而不是 file。
解决方案示例如下:
public class ZipFileServlet extends HttpServlet {
private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.
private YourFileDAO yourFileDAO = YourDAOFactory.getYourFileDAO();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String[] fileIds = request.getParameterValues("fileId");
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=\"allfiles.zip\"");
ZipOutputStream output = null;
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
try {
output = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE));
for (String fileId : fileIds) {
YourFileItem item = yourFileDAO.find(fileId);
if (item == null) continue; // Handle yourself. The fileId may be wrong/spoofed.
InputStream input = null;
try {
input = new BufferedInputStream(item.getInputStream(), DEFAULT_BUFFER_SIZE);
output.putNextEntry(new ZipEntry(item.getName()));
for (int length = 0; (length = input.read(buffer)) > 0;) {
output.write(buffer, 0, length);
}
output.closeEntry();
} finally {
if (input != null) try { input.close(); } catch (IOException logOrIgnore) { /**/ }
}
}
} finally {
if (output != null) try { output.close(); } catch (IOException logOrIgnore) { /**/ }
}
}
}