附件下载要求:不能通过URL访问,可以实现下载的权限控制
显示下载链接的action:
//显示附件列表和下载按钮
if(articleInstance.durl)
{
def urlList=articleInstance.durl.split(',');
def urlNameList=articleInstance.durlName.split(',');
def uploadList="";
// 循环处理该数组中每个元素
int n;
for(int i=0;i<urlList.size();i++)
{
if(urlList[i])
{
n=i+1;
uploadList+=n+". <img src='../../images/common.gif'> " +urlNameList[i]+" <a href=/"${createLink(uri: '/')}article/download?id=${articleInstance.id}&num=${i}/"><font color='#056191'>下载</font></a><br>";
}
}
params.uploadList=uploadList;
}
Gsp:
<g:if test="${params.uploadList == null}">
未上传附件
</g:if>
<g:else>
${params?.uploadList}
</g:else>
实现下载的action:
def download={
def fileNum=Integer.parseInt(params.num);
def articleInstance = Article.get(params.id)
def urlList=articleInstance.durl.split(',');
def fileList=articleInstance.durlName.split(',');
def fileUrl=urlList[fileNum]; //下载文件地址
def fileName=fileList[fileNum]; //下载真实文件名
//def webRootDir = servletContext.getRealPath("/"); //获得删除文件路径
ConfigObject configObject = ConfigurationHolder.getConfig()
def webRootDir =configObject.getProperty("uploadFileConfig").URLconfig;
def filepath = new File(webRootDir, "/upload/${fileUrl}");
//判断文件是否存在
if(filepath.isFile())
{
def out =null
def inputStream = new FileInputStream(filepath)
//设置下载文件的信息
response.setHeader("Content-disposition", "attachment; filename="+ URLEncoder.encode(fileName, "utf-8"));
response.setHeader("Content-Length","${inputStream.available()}");
response.setContentType("application/octet-stream");
response.contentType = "application/x-rarx-rar-compressed";
try
{
out = response.outputStream
byte[] buffer = new byte[1024]
int i = 0
while ((i = inputStream.read(buffer,0,buffer.length)) != -1) {
out.write(buffer, 0, i)
}
out.flush()
}
catch (Exception e)
{
// println "取消下载";
// e.printStackTrace()
}
finally
{
if(out!=null)
try
{
out.close();
if(inputStream!=null)
inputStream.close() ;
}
catch(Exception e)
{
// println "关闭IO异常";
}
}
}
else
{
flash.message = "文件不存在"
redirect(action: "list")
}
}