小弟是一名学员,在模拟文件上传下载时遇到了不能解决的问题,希望各位高手帮忙看下!
现在是下载中的一个问题,我已经在一个action中拿到了要下载文件的name和path,在这个jsp页面中发送请求到downloadLinkAction中取得流,下面是jsp页面(只贴了有用部分):
<head>
<script type="text/javascript"> function downloadFile(fileName,filePath) {
location.href=encodeURI("download.action?fileName="+fileName+"&filePath="+filePath);
}
</script></head>
<body>
<s:iterator value="#request.fileMap"> <a href="#" onclick="downloadFile('<s:property value="key" />','<s:property value="value" />');">
<s:property value="key"/>
</a><br>
</s:iterator>
</body>
下面是downloadLinkAction:
package com.sff.project.action;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;import com.sff.project.util.BaseAction;public class DownloadLinkAction extends BaseAction {
private String fileName; private String filePath;
@Override
public String execute() throws Exception {
return SUCCESS;
} public InputStream getDownloadFile(){
try{
String path = getFilePath();
File file=new File(path);
InputStream is=new FileInputStream(file);
return is;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
public String getFileName() {
try {
return new String(fileName.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return fileName;
}
} public String getFilePath() {
try {
return new String(filePath.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return filePath;
}
} public void setFileName(String fileName) {
this.fileName = fileName;
} public void setFilePath(String filePath) {
this.filePath = filePath;
}
}
下面是struts中的配置:
<action name="download" class="com.sff.project.action.DownloadLinkAction">
<result name="success" type="stream">
<param name="contentType">application/octet-stream;charset=ISO-8859-1</param>
<param name="contentDisposition">
attachment;filename="${fileName}"
</param>
<param name="inputName">
downloadFile
</param>
<param name="bufferSize">
4096
</param>
</result>
</action>
下面是执行Action中抛出的异常(好像是在struts内部抛出的):
严重: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:752)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:505)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:102)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:619)
请高手帮忙解决一下,很急,小弟在此谢过了!
现在是下载中的一个问题,我已经在一个action中拿到了要下载文件的name和path,在这个jsp页面中发送请求到downloadLinkAction中取得流,下面是jsp页面(只贴了有用部分):
<head>
<script type="text/javascript"> function downloadFile(fileName,filePath) {
location.href=encodeURI("download.action?fileName="+fileName+"&filePath="+filePath);
}
</script></head>
<body>
<s:iterator value="#request.fileMap"> <a href="#" onclick="downloadFile('<s:property value="key" />','<s:property value="value" />');">
<s:property value="key"/>
</a><br>
</s:iterator>
</body>
下面是downloadLinkAction:
package com.sff.project.action;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;import com.sff.project.util.BaseAction;public class DownloadLinkAction extends BaseAction {
private String fileName; private String filePath;
@Override
public String execute() throws Exception {
return SUCCESS;
} public InputStream getDownloadFile(){
try{
String path = getFilePath();
File file=new File(path);
InputStream is=new FileInputStream(file);
return is;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
public String getFileName() {
try {
return new String(fileName.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return fileName;
}
} public String getFilePath() {
try {
return new String(filePath.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return filePath;
}
} public void setFileName(String fileName) {
this.fileName = fileName;
} public void setFilePath(String filePath) {
this.filePath = filePath;
}
}
下面是struts中的配置:
<action name="download" class="com.sff.project.action.DownloadLinkAction">
<result name="success" type="stream">
<param name="contentType">application/octet-stream;charset=ISO-8859-1</param>
<param name="contentDisposition">
attachment;filename="${fileName}"
</param>
<param name="inputName">
downloadFile
</param>
<param name="bufferSize">
4096
</param>
</result>
</action>
下面是执行Action中抛出的异常(好像是在struts内部抛出的):
严重: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:752)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:505)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:102)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:619)
请高手帮忙解决一下,很急,小弟在此谢过了!
解决方案 »
- struts2如何将js中的对象数组传递给action
- response怎么转送数组
- 大虾们帮帮忙吧!hibernate分组查询报错误
- test
- 两个问题 望好心人帮忙指点
- jdom解析xml文档-——————删除节点之后会把xml文档的头部声明<?xml version = "1.0" encoding="UTF-8" ?>删除
- 关于如何实现选中项目,自动将该项目对应的数据填入文本框的问题
- 在hibernate中,如果要更新一个对象某些属性的值(不是全部),session.saveOrUpdate(obj),会把那些不需更新的属性都赋值为空,有什么好
- unitils作单元测试 时用@SpringApplicationContext加载配置文件为nll
- 请问一下hibernate如果处理临时表的问题?
- Spring+Struts 2 实现细粒度权限控制问题
- java http下载
2.其次在配置文件中获取属性值不用添加引号${fileName}
3.你是通过链接get方式请求的。你在action中应该通过request.getParameter()来获取参数值。
downloadFile
</param>
谢谢朋友,这里的配置就是调用getDownloadFile方法的,并且fileName和filePath都能正常拿到,也就是在返回inputstream的时候抛出的异常,看似是struts内部报的异常,不知道如何能解决
但是提交确实是get,所以需要用request.getParameter()取值,所以导致你的入口方法,返回的流出现异常
而你的只有路径,没有拼上文件名字,你觉得能找到吗??
先确定 InputStream is=new FileInputStream(file);
这步有没问题