下载的文件是0字节,有什么问题吗?

时间:2012-02-27 07:37:09

标签: java groovy struts2

需要帮助搞清楚,为什么下载的文件大小是0字节?点击下载按钮,页面会弹出一个保存或打开的对话框,当我选择保存时,某个位置会保存文件,但它是一个空文件。这有什么不对吗?

JSP文件

<form target="_blank" method="get" action="/csm/download.action" >
    <input type="hidden" id="absFileName" name="absFileName" value="">
    <input type="submit" class="btn" id="btnDownloadConfig" value="Download Configuration"/>
</form>

struts.xml中

<action name="download" class="com.abc.csm.actions.DownloadConfiguration">
    </action>

我的下载代码

String filePath = ServletActionContext.getServletContext().getRealPath("/")
filePath+=executionResponse

def splits=filePath.split("/")

cfgfileFileName=splits[splits.length-1]

println filePath+", "+cfgfile+", "+cfgfileFileName+", "+executionResponse

File f=new File(filePath)

println("Does file Exists? "+f.exists())

InputStream  inputStream = new FileInputStream(f)

response.setContentType("APPLICATION/xml")

response.addHeader("Content-Disposition", "attachment; filename=\""+cfgfileFileName+"\"")

我在控制台的输出

E:\Tomcat 6\webapps\csm\files//1123/Infa9_1_csmclientbeetle.xml, Infa9_1_csmclientbeetle.xml, files//1123/Infa9_1_csmclientbeetle.xml
Does file Exists? true

我在tomcat webapps中的文件位置

E:\Tomcat 6\webapps\csm\files\1123

更新

我找到了一个类似的question来帮助我

这就是我用InputStream做的事情

FileInputStream ins = new FileInputStream(f)
    OutputStream out = response.getOutputStream()
    byte[] buf = new byte[1024]
    int len = 0
    while ((len = ins.read(buf)) >= 0)
    {
        out.write(buf, 0, len)
    }
    ins.close()
    out.close()

3 个答案:

答案 0 :(得分:4)

InputStream  inputStream = new FileInputStream(f)
response.setContentType("APPLICATION/xml")
response.addHeader(
  "Content-Disposition", "attachment; filename=\""+cfgfileFileName+"\"")
那是全部吗?你在哪里发送文件?你可能会错过像

这样的东西
IOUtils.copy(inputStream, response.getOutputStream())

答案 1 :(得分:4)

我相信您可以使用Stream result类型的S2版本以更灵活的方式处理您的下载功能。您需要在动作类中定义fileInputStream,用于下载您的内容。

您可以动态设置配置文件中的所有其他内容。这是一个示例代码

public class DownloadAction extends ActionSupport{

    private InputStream fileInputStream;

    public InputStream getFileInputStream() {
        return fileInputStream;
    }

    public String execute() throws Exception {
        fileInputStream = new FileInputStream(new File("location of your file"));
        return SUCCESS;
    }
}

你可以使用你的struts.xml文件的流结果

<action name="download" class="com.abc.csm.actions.DownloadConfiguration">
    <result name="success" type="stream">
      <param name="contentType">application/octet-stream</param>
      <param name="inputName">fileInputStream</param>
      <param name="contentDisposition">attachment;filename="fileABC.txt"</param>
      <param name="bufferSize">1024</param>
    </result>
   </action>

动作中可以动态设置动作标签内的所有上述参数。您只需要在动作类中定义属性并在配置中使用它们。

例如,如果要设置content-type,请在动作类中使用其getter和setter动态创建属性,并在execute / any other方法中设置此属性的值。 您需要在struts.xml文件中使用动态属性值,如

 <action name="download" class="com.abc.csm.actions.DownloadConfiguration">
        <result name="success" type="stream">
          <param name="contentType">${contentType}</param>
          <param name="inputName">fileInputStream</param>
          <param name="contentDisposition">attachment;filename="fileABC.txt"</param>
          <param name="bufferSize">1024</param>
        </result>
       </action>

有关可在流结果中设置的各种属性的详细信息,请参阅官方文档

stream-result

答案 2 :(得分:0)

尝试将此添加到您的编写器实例:

myWriter.flush();