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 }" οnclick="show();" >点击下载</a>
οnclick=show();
页面刷新下载次数
function show()
{
setTimeout("location.href='当前页面url'",5000);
}