需要帮助搞清楚,为什么下载的文件大小是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()
答案 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>
有关可在流结果中设置的各种属性的详细信息,请参阅官方文档
答案 2 :(得分:0)
尝试将此添加到您的编写器实例:
myWriter.flush();