`

我想将文件压缩成流(ZipOutPutStream),不生成临时文件,然后下载到客户端。

阅读更多

我想将文件压缩成流(ZipOutPutStream),不生成临时文件,然后下载到客户端。


而struts2的下载是用的InputStream,请问如何进行转换?或者有别的方法。

我以前用Servlet实现过将文件将数据生成ServletOutPutStream然后下载,不知道用Struts2能不能实现,谢谢!

刚看到一种方式可以解决临时文件的问题,就是在execute方法中return null;
这样就可以在servlet上下文中取到HttpServletResponse,用servlet的方法将输出流传到客户端。

不过还是希望能有struts2的方法!

 

恩,对于 Struts2 来说,其有一个 ResultType 为 Stream Result 的类型,他直接获取 InputStream 输入流,可以想象他是做了些事情才返回给客户端的, 那么这样很明显无法满足你的需求,你需要直接利用 ZipOutPutStream 输出给客户端,并且是没有临时文件的,所以无法使用到 Struts2 提供的 Stream Result 返回类型,所以得用自己的解决方案..

我的想法很直接, 就是利用 Interceptor 来解决这个问题,但不是在请求进入的阶段,而是请求出来的阶段,使用这个就要解决两个问题,第一个如何让 Action 进入这个 Interceptor; 第二个,如何在 Interceptor 中拿到你动态生成的 ZipOutPutStream;
第一个问题: 这个比较好解决, 对这个 Action 的 <interceptors> 进行特殊配置就可以了,一个专门为这一个 Action 作用的 Interceptor;
第二个问题: 这个可以利用 Struts2 的 OGNL 中的 ValueStack 来解决,在 Action 中利用 ActionContext 拿到 ValueStack 将 ZipOutputStream 保存在其中,然后返回一个普通返回类型(后面会有解释); 当进入 Interceptor 以后,你可以借助 ActionInvocation 来获取 ValueStack 从而获得到 ZipOutputStream, 然后在 Interceptor 中利用 ActinoContext 或得 HttpServletResponse 将 ZipOutputStream 写回客户端;

补充: 为什么可以算便返回一个试图类型呢? 可以查看下其文档当中的 Big Picture 一章, Interceptor 的逆回阶段是在 Result 之后,也就是说在 Interceptor 中操作 HttpServletResponse 可以将前面的覆盖掉,所以这样做了;

由于你说需要 Struts2 的解决方法,所以使用了 ValueStack 传递数据,当然也可使用其他作用域例如 Session,毕竟ActionContext 由于使用thread local实现所以在任何地方都可以随意获取;

这只是一个思路,其实你将 execute方法中return null; 也是一样的,只是将我这个思路的向客户端写数据的操作提前了而已;


-------------
至于这么麻烦吗?
配置一个action:
  <action name="export" class="co.dnl.editor.action.ExportAction">
<result name="success" type="stream">
<!-- param name="contentType">application/zip</param-->
<param name="contentType">application/zip</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">
filename="mycontent.zip"
</param>
<param name="bufferSize">1024</param>
</result>
  </action>
写一个action, 确保有inputStream变量:
public class ExportAction extends BaseAction 
{
private InputStream inputStream;

  public String execute() 
  {
  log.info("in ExportAction");
  String str = "hello, world. I am from struts2 output";
  inputStream = new ByteArrayInputStream(str.getBytes());

  return Action.SUCCESS;
  }

public InputStream getInputStream() {
return inputStream;
}

public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
   
   
}
访问: http://localhost:8080/yourApp/export.action
导出下载了。
over

 

 

个人签名

-------------------------------------

 

图盾 淘宝保护 保护图片 图片防盗

分享到:
评论

相关推荐

    Java实现批量下载并压缩文件.pptx.pptx

    6. **PPT展示**:在项目报告或演示中,可以生成一个PPT来展示整个流程,包括Java批量下载文件的逻辑、MinIO的存储功能介绍以及使用`ZipOutputStream`进行文件压缩的步骤。 通过以上步骤,可以实现Java环境下从MinIO...

    java将数据导入多个excel并压缩,亲测可用

    可以使用`ZipOutputStream`将多个Excel文件压缩到一个ZIP文件中。 - **创建ZipEntry**:对于每个要添加到ZIP文件的Excel文件,创建一个`ZipEntry`,如`ZipEntry zipEntry = new ZipEntry("模块名.xls");`。 - **...

    FTP文件上传下载CSV文件生成ZIP压缩

    FileZipUtils可能会提供将一组文件或目录压缩成ZIP,或将ZIP文件解压缩到指定目录的方法。 最后,IOUtil.java可能包含了一些通用的输入/输出流操作,如读写文件、复制文件、关闭流等。这些辅助函数有助于提高代码的...

    java压缩多个文件并且返回流示例

    在Java中,我们可以使用`java.util.zip`包中的`ZipOutputStream`类来创建ZIP压缩文件,并通过`ByteArrayOutputStream`将结果保存为字节数组流,以便在程序中进一步处理。 首先,我们需要理解`FileInputStream`和`...

    Applet与Swing 压缩文件 源码

    同时,对于网络应用,如Applet,可能需要考虑在客户端和服务器之间传输压缩文件,这涉及到网络I/O和安全问题。Swing可以用于创建具有用户友好的界面,让用户能够选择文件或目录进行压缩或解压缩操作。 总之,Java的...

    java动态导出excel压缩成zip下载的方法

    接着,使用ZipOutputStream将excel文件压缩成zip格式,并将其下载到客户端。 创建文件夹和excel文件 在java中,可以使用File类来创建文件夹和excel文件。首先,使用File类的mkdirs()方法创建文件夹,然后使用jxl库...

    Java OSS批量下载并压缩为ZIP代码实例

    在该代码实例中,使用了ZipOutputStream对象将批量下载的文件压缩为ZIP文件。 6. OSSClient OSSClient是一个OSS客户端对象,提供了对OSS的操作接口。通过使用OSSClient对象,开发者可以批量下载OSS中的文件,并将...

    socket传输zip文件

    服务端需要将生成的ZIP文件写入到Socket的OutputStream,客户端则从Socket的InputStream读取这些字节,然后写入到本地文件系统,完成接收。 6. **异常处理**: 在整个过程中,需要注意异常处理,如网络连接异常、...

    使用POI,实现excel文件导出,图片url导出文件,图片和excel文件导出压缩包

    - **添加文件到压缩包**:使用`ZipOutputStream`的`putNextEntry()`方法打开一个新条目,然后写入文件数据,最后调用`closeEntry()`关闭条目。 - **关闭输出流**:完成所有文件添加后,记得关闭ZipOutputStream。 ...

    java 压缩加密项目

    Servlet接收到请求后,调用相关的Java类进行压缩和加密,最后可能将结果存储到服务器或返回给客户端。 4. **相关jar包**: 项目中可能包含一些额外的jar包,比如用于加密的第三方库,如Bouncy Castle,它提供了更...

    JAVA实现的企业对账单下载

    4. **网络传输**:在服务器端生成压缩文件后,可以通过HTTP响应将文件发送到客户端进行下载。使用`javax.servlet`包中的`HttpServletResponse`对象,可以设置响应头,指示浏览器开始下载文件。 5. **安全与性能优化...

    java实现服务器文件打包zip并下载的示例(边打包边下载)

    总结来说,这个Java实现利用了HTTP的chunked传输机制和ZIP压缩功能,实现在服务器端即时打包文件并提供给客户端下载,整个过程中不依赖任何缓存,实现了真正的边打包边下载。这样的设计不仅高效,还能减少服务器资源...

    asp.net ICSharpCode.SharpZipLib.Zip 压缩

    这段代码会接收一个文件名数组和一个输出ZIP文件路径,然后遍历文件名列表,将每个文件添加到ZIP流中。`ZipOutputStream`是用于创建ZIP文件的核心类,`ZipEntry`表示ZIP文件中的一个条目。通过调用`PutNextEntry`...

    同时汇出多个Excel的关键代码

    - `out`:输出流对象,用于将最终压缩文件写入到客户端。 #### 2. 数据准备与处理 ```java List&lt;SportAgeGroup&gt; deleteAgeGroups = new ArrayList(); List&lt;SportAgeGroup&gt; ageGroups = sportAgeGroupDao.findAll()...

    读取jdbc上FTP放置文件

    这一步骤在描述中表现为"生成文件打包",意味着数据文件被整合成一个压缩文件,以便后续上传。 最后,**FTP**是互联网上广泛使用的文件传输协议,用于在客户端和服务器之间交换文件。Java提供了`java.net`包下的`...

    JAVA文件传输(论文+源代码).zip

    9. **文件压缩与解压缩**:为了减小传输体积,文件可能需要在发送前进行压缩,如使用`ZipOutputStream`和`ZipInputStream`进行ZIP格式的压缩和解压缩。 10. **网络优化**:使用缓冲区优化数据读写,减少网络I/O操作...

    bootstrap+springMvc+spring实现图片上传下载

    在图片上传成功并生成JSON文件后,可以利用`ZipOutputStream`将图片文件和JSON文件一起压缩成ZIP格式的包。这样,用户可以一次性下载所有上传的图片及相关信息,便于管理和传输。 总结起来,"bootstrap+springMvc+...

    JSP 多个文件打包下载代码

    最后,关闭`ZipOutputStream`,完成整个ZIP文件的生成和发送到客户端的过程。用户端的浏览器接收到这个ZIP文件后,会提示用户下载。 总的来说,这段JSP代码实现了将用户指定的一组文件打包成ZIP文件,并提供给用户...

    FTP上传及解压压缩包问题

    在实际应用中,完成本地文件的压缩解压后,可以通过上述提到的FTP客户端库将文件上传至远程服务器。 #### 四、总结 通过Java标准库提供的`java.util.zip`包,我们能够高效地处理ZIP文件的压缩与解压工作。结合FTP...

    javaweb文件打包批量下载代码

    11. **流式传输压缩文件**:创建一个`ZipOutputStream`,写入压缩文件内容,然后通过`response.getOutputStream()`将数据流式传输到客户端。 12. **清理资源**:在下载完成后,记得关闭所有打开的输入/输出流,删除...

Global site tag (gtag.js) - Google Analytics