action
public class DownLoadAction extends BaseSupportAction
{
String filePath;
private DownLoadServ serv = null;
public void downFile()
{
LOG.info("需要下载的文件路径:" + filePath);
// String filePath, HttpServletResponse response, boolean isOnLine
try
{
serv.downFile(filePath, ServletActionContext.getResponse(), false);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getFilePath()
{
return filePath;
}
public void setFilePath(String filePath)
{
this.filePath = filePath;
}
public DownLoadServ getServ()
{
return serv;
}
public void setServ(DownLoadServ serv)
{
this.serv = serv;
}
}
service
public class DownLoadServ
{
/**
* @param filePath
*/
public void downFile(String filePath, HttpServletResponse response, boolean isOnLine)
throws Exception
{
File f = new File(filePath);
if (!f.exists())
{
response.sendError(404, "File not found!");
return;
}
BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
byte[] buf = new byte[1024];
int len = 0;
response.reset(); // 非常重要
if (isOnLine)
{ // 在线打开方式
URL u = new URL("file:///" + filePath);
response.setContentType(u.openConnection().getContentType());
response.setHeader("Content-Disposition", "inline; filename=" + f.getName());
// 文件名应该编码成UTF-8
}
else
{ // 纯下载方式
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition",
"attachment; filename=" + f.getName());
}
OutputStream out = response.getOutputStream();
while ((len = br.read(buf)) > 0)
out.write(buf, 0, len);
br.close();
out.close();
}
}
页面
<a href="downFile.action?filePath="文件路径">文件名</a>
只需在页面上传入文件路径即可完成下载。也适用于其他框架。