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

Java 下载的文件是0字节,有什么问题吗?,java,groovy,struts2,Java,Groovy,Struts2,需要帮助了解下载的文件大小为何为0字节吗?单击下载按钮,页面会弹出一个保存或打开对话框,当我选择保存某个位置时,会保存文件,但它是一个空文件。怎么了 JSP文件 <form target="_blank" method="get" action="/csm/download.action" > <input type="hidden" id="absFileName" name="absFileName" value=""> <input type=

需要帮助了解下载的文件大小为何为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>
控制台中的输出

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
更新

我找到了一个类似的帮助我的方法

这就是我对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()

尝试将其添加到您的writer实例:

myWriter.flush();

尝试将其添加到您的writer实例:

myWriter.flush();
就这些吗?你要把文件寄到哪里?你可能会错过这样的机会

IOUtils.copy(inputStream, response.getOutputStream())
就这些吗?你要把文件寄到哪里?你可能会错过这样的机会

IOUtils.copy(inputStream, response.getOutputStream())

我相信您可以使用S2内置流结果类型以更灵活的方式处理下载功能。您只需在action类中定义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文件中使用stream result

<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>
所有上述参数,在你的动作标签内,都可以动态设置。您只需要在action类中定义属性并在配置中使用它们

e、 g如果要动态设置内容类型,请在action类中使用其getter和setter创建一个属性,并在execute/任何其他方法中设置该属性的值。 您需要在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>
有关可在流结果中设置的各种属性的详细信息,请参阅官方文档


我相信您可以使用S2内置流结果类型以更灵活的方式处理下载功能。您只需在action类中定义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文件中使用stream result

<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>
所有上述参数,在你的动作标签内,都可以动态设置。您只需要在action类中定义属性并在配置中使用它们

e、 g如果要动态设置内容类型,请在action类中使用其getter和setter创建一个属性,并在execute/任何其他方法中设置该属性的值。 您需要在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>
有关可在流结果中设置的各种属性的详细信息,请参阅官方文档


您的代码实际上对inputstream有什么作用吗?我不知道您为什么要这样做,而使用stream result可以以更干净的方式来做同样的事情。@Umesh:您有一个例子,我可以看一下吗?Thanks@AbhishekSimon:查看我的最新评论。我相信你没有使用S2的真正威力。@Umesh:在那个链接中,它有一些设置文件名附件的东西;filename=document.pdf,但在我的情况下,我需要动态设置。您的代码是否对inputstream执行了任何操作?我不确定您为什么要执行所有这些操作,而使用stream result可以以更干净的方式执行这些操作。@Umesh:您有一个示例,我可以看一下吗?Thanks@AbhishekSimon:查看我的最新评论。我相信你没有使用S2的真正威力。@Umesh:在那个链接中,它有一些设置文件名附件的东西;filename=document.pdf但在我的情况下,我需要将其动态设置为什么编写器?这会有什么不同呢?当将数据写入文件或其他地方时,比如套接字或其他东西,您应该将输入流包装到更高级的东西,比如FileWriter类,以使其更易于处理。FileWriter类有一个名为flush的方法,它可以立即将流中的数据写入文件、套接字等。这是必需的,因为数据并非总是在接收的同时写入,流将数据写入缓冲区,因此为了确保数据写入,应使用flush方法。flush在out.close时自动发生。添加一个显式的不会解决这个问题。哪个作者?这会有什么不同呢?当将数据写入文件或其他地方时,比如套接字或其他东西,您应该将输入流包装到更高级的东西,比如FileWriter类,以使其更易于处理。FileWriter类有一个名为flush的方法,它可以立即将流中的数据写入文件、套接字等。这是必需的,因为数据并非总是在接收的同时写入,流将数据写入缓冲区,因此为了确保数据写入,应使用flush方法。flush在out.close时自动发生。添加一个明确的标签并不能解决这个问题。对于一个新的struts2用户来说,完整的答案很好,在struts2标签Umesh上做得很好,按照这个速度,你可能是第一个在这个标签上有银的。@Quaternion:谢谢夸奖:对于一个新的struts2用户,完整的答案很好,干得好
在整个struts2 tag Umesh中,以这种速度,您可能会是第一个在该tag中获得银牌的人。@Quaternion:谢谢您的夸奖: