下载action代码如下:
/**
* 下载
*/
@Action(value = "download")
public void download()
throws Exception
{
String annexId = this.getRequest().getParameter("annexId");
Annex annex = fileService.getAnnexById(annexId);
if (annex == null)
{
return;
}
//数据库存的路径字段为空则blob下载
if (!CommonUtil.isNotEmpty(annex.getAnnexPath()))
{
downFromOracle(annex);
}
else
{
downFromFile(annex);
}
}
/**
* 从服务器下载
*/
private void downFromFile(Annex annex)
throws IOException
{
String annexName = annex.getAnnexName();
// String filePath = request.getSession().getServletContext().getRealPath(upPath) + "\\" + annexName;
String filePath = upPath + "\\" + annexName;
File file = new File(filePath); // 根据文件路径获得File文件
// 文件名
response.setHeader("Content-Disposition", "attachment;filename=\""
+ new String(annexName.getBytes("gb2312"), "ISO8859-1") + "\"");
response.setContentLength((int)file.length());
byte[] buffer = new byte[4096];// 缓冲区
BufferedOutputStream output = null;
BufferedInputStream input = null;
try
{
input = new BufferedInputStream(new FileInputStream(file));
output = new BufferedOutputStream(response.getOutputStream());
int n = -1;
// 遍历,开始下载
while ((n = input.read(buffer, 0, 4096)) > -1)
{
output.write(buffer, 0, n);
}
output.flush(); // 不可少
response.flushBuffer();// 不可少
}
catch (Exception e)
{
// 异常自己捕捉
}
finally
{
// 关闭流,不可少
if (input != null)
input.close();
if (output != null)
output.close();
}
}
/**
* 从数据库下载
*/
private void downFromOracle(Annex annex)
throws Exception
{
Blob blob = annex.getAnnexCont();
String annexName = annex.getAnnexName();
InputStream input = blob.getBinaryStream();
// 文件名
response.setHeader("Content-Disposition", "attachment;filename=\""
+ new String(annexName.getBytes("gb2312"), "ISO8859-1") + "\"");
byte[] buffer = new byte[4096];
BufferedOutputStream output = null;
try
{
output = new BufferedOutputStream(response.getOutputStream());
int n = -1;
// 遍历,开始下载
while ((n = input.read(buffer, 0, 4096)) > -1)
{
output.write(buffer, 0, n);
}
output.flush(); // 不可少
response.flushBuffer();// 不可少
}
catch (Exception e)
{
// 异常自己捕捉
}
finally
{
// 关闭流,不可少
if (input != null)
input.close();
if (output != null)
output.close();
}
}
模拟下载的jsp如下:
<div style="text-align: center;">
<a>附件id</a>
<select id="annexId">
<c:forEach items="${annexList }" var="an">
<option value="${an.annexId }">${an.annexName }</option>
</c:forEach>
</select><br>
<!-- <a>1-数据库下载,其他服务器下载</a>
<select id="flag">
<option value="1">数据库下载</option>
<option value="0">服务器下载</option>
</select> -->
<input type='button' value="ajax下载" onclick='down();'>
</div>
<iframe id="fileDownFrame" src="" style="display:none; visibility:hidden;"></iframe>
js代码如下:
function down(){
$("#fileDownFrame").attr("src","${ctx}/file/download.action?annexId="+$("#annexId").val()+"&flag="+$("#flag").val());
}