现在的位置: 首页 > 综合 > 正文

Grails附件下载

2019年09月25日 ⁄ 综合 ⁄ 共 3127字 ⁄ 字号 评论关闭

附件下载要求:不能通过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]+"&nbsp;&nbsp;&nbsp;<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")
        }
      }

抱歉!评论已关闭.