struts中downloadAction下载详解,包括统计下载次数,刷新页面上下载次数
这是Action代码 package action; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.actions.DownloadAction.ResourceStreamInfo; import org.apache.struts.actions.DownloadAction.StreamInfo; import com.huatf.agitar.service.HelpproductService; /** * 文档下载类 * @author pxAgitar * */ public class DownAction { //services 类 private HelpproductService helpproductService = new HelpproductService(); //地址 private String path; //文件路径 private String filename; protected StreamInfo getStreamInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String paths = path+filename; response.setHeader("content-disposition", "attachment; filename="+ filename); ResourceStreamInfo rsi = new ResourceStreamInfo("application/file",request.getSession().getServletContext(),paths); return rsi; } public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { path = request.getParameter("path"); filename = request.getParameter("file"); StreamInfo info = getStreamInfo(mapping, form, request, response); String contentType = info.getContentType(); InputStream stream = info.getInputStream(); ServletOutputStream fs = response.getOutputStream(); try { response.setContentType(contentType); copy(stream, fs); }catch(Exception e) { //用户点击取消下载后,还回为空,不记录下载次数 return null; } finally { if (stream != null) { stream.close(); } } //向后台添加下载次数 helpproductService.addCount(filename); //必须还回空,不然会报错:java.lang.IllegalStateException: Cannot forward after response has been committed return null; } public int copy(InputStream input, OutputStream output) throws IOException { byte[] buffer = new byte[getBufferSize()]; int count = 0; int n = 0; while (-1 != (n = input.read(buffer))) { output.write(buffer, 0, n); count += n; } if(count !=0) { output.flush(); input.close(); } //这里还回的是文件大小 return count; } protected int getBufferSize() { return 4096; } } 配置文件: <action path="/download" scope="request" type="action.DownAction"/> JSP代码: <a href="download.do?path=${helppro.docurl }&file=${helppro.docname }" onclick="show();" >点击下载</a> onclick=show(); 页面刷新下载次数 function show() { setTimeout("location.href='当前页面url'",5000); }