Java 下载的文件是0字节,有什么问题吗?
需要帮助了解下载的文件大小为何为0字节吗?单击下载按钮,页面会弹出一个保存或打开对话框,当我选择保存某个位置时,会保存文件,但它是一个空文件。怎么了 JSP文件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=
<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:谢谢您的夸奖: