Struts2配置如下:
<action name="download" class="sgProcessListAction"> <result name="success" type="stream"> <param name="contentType">application/octet-stream;charset=ISO8859-1</param> <param name="inputName">inputStream</param> <param name="contentDisposition">attachment;filename=${downloadFileName}</param> <param name="bufferSize">4096</param> </result> </action>
配置参数说明:
contentType
内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表 GIF图片,image/jpeg代表JPG图片,如果文件类型未知的话就使用application/octet-stream
inputName
下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream 的属性需要编写getInputStream()方法
contentDisposition
文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为:
attachment; filename=${downloadFileName},表示文件下载的时候保存的名字应为动态获取的文件名称 。如果直接写filename=${downloadFileName} ,那么默认情况是代表inline ,浏览器会尝试自动打开它,等价于这样的写法:inline; filename=${downloadFileName}
bufferSize
下载缓冲区的大小
SgProcessListAction代码如下:
public class SgProcessListAction extends ActionSupport {
private SgProcessListService sgProcessListService;
private SgProcessList sgProcessList;
private List<SgProcessList> sgProcessLists;
private String fileName;// 初始的通过param指定的文件名属性
public void setFileName(String fileName) {
this.fileName = fileName;
}
/** 提供转换编码后的供下载用的文件名 */
public String getDownloadFileName() {
String downFileName = fileName;
try {
downFileName = new String(downFileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return downFileName;
}
public SgProcessListService getSgProcessListService() {
return sgProcessListService;
}
public void setSgProcessListService(SgProcessListService sgProcessListService) {
this.sgProcessListService = sgProcessListService;
}
public SgProcessList getSgProcessList() {
return sgProcessList;
}
public void setSgProcessList(SgProcessList sgProcessList) {
this.sgProcessList = sgProcessList;
}
public List<SgProcessList> getSgProcessLists() {
return sgProcessLists;
}
public void setSgProcessLists(List<SgProcessList> sgProcessLists) {
this.sgProcessLists = sgProcessLists;
}
public String list() throws Exception {
// TODO Auto-generated method stub
return super.execute();
}
public InputStream getInputStream() throws Exception {
// TODO Auto-generated method stub
HttpServletRequest request=ServletActionContext.getRequest();
int id=Integer.valueOf(request.getParameter("id"));
this.sgProcessList=this.sgProcessListService.findByID(id);
String targetDirectory = request.getRealPath("/sgfiles/");
if(sgProcessList.getPType()==0)//责任认定
{
targetDirectory+="\\rd\\"+sgProcessList.getPUrl();
}
if(sgProcessList.getPType()==1)//结案报告
{
targetDirectory+="\\ja\\"+sgProcessList.getPUrl();
}
this.fileName=sgProcessList.getPname();
return new FileInputStream(targetDirectory);
}
public String add() throws Exception {
// TODO Auto-generated method stub
return super.execute();
}
public String del() throws Exception {
// TODO Auto-generated method stub
HttpServletRequest req=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
response.setContentType("text/html; charset=UTF-8");
Integer id=Integer.valueOf(req.getParameter("id").toString());
this.sgProcessList=this.sgProcessListService.findByID(id);
try
{
this.DeleteFile(sgProcessList.getPType(),sgProcessList.getPUrl());
this.sgProcessListService.deleteSgProcessList(id);
response.getWriter().println("1");
response.getWriter().close();
}
catch(Exception e){
response.getWriter().println("0");
response.getWriter().close();
}
return null;
}
private Boolean DeleteFile(int _type,String _name)
{
HttpServletRequest request = ServletActionContext.getRequest();
String targetDirectory = request.getRealPath("/sgfiles/");
if(_type==0)
{
targetDirectory+="\\rd\\"+_name;
}
else
{
targetDirectory+="\\ja\\"+_name;
}
File f=new File(targetDirectory);
if(f.exists())
{
f.delete();
return true;
}
else
{
return false;
}
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}