在Grails应用程序中存储临时文件的位置?

时间:2011-07-22 09:58:45

标签: grails jasper-reports

在我的grails应用程序中使用jasper Reports我正在创建pdf格式的报告,我想让它可用于下载..所以在我的应用程序的目录中我需要保存文件...? 提前谢谢

2 个答案:

答案 0 :(得分:1)

可能duplicate

您可以将文件存储在任何您喜欢的位置,但是请注意存储文件的目录,这样如果您没有主动清理它们,它们最终不会占用所有磁盘空间。

所以,如果您想存储文件并允许用户现在或以后下载(未测试,可能更好但显示概念),我会采取以下措施。

创建一个代表您的报告目录的类

class ReportDirectory{

   static final String path = "./path/to/reports/"; //<-- generic path on your SERVER!

   static{
       //static initializer to make sure directory gets created.  Better ways to do this but this will work!

       File pathAsFile = new File(path).mkdirs()

       if (pathAsFile.exists()){
          println("CREATED REPORT DIRECTORY @ ${pathAsFile.absolutePath}");
       }else{
          println("FAILED TO CREATE REPORT DIRECTORY @ ${pathAsFile.absolutePath}");
       }

   }

   public static File[] listFiles(){
       return new File(path).listFiles(); //<-- maybe use filters to just pull pdfs?
   }

   public static void addFile(File file){
       FilesUtil.copyFileToDirectory(file, new File(path)); //<-- using apache-commons-io
   }

   public static void deleteAll(){
       listFiles().each(){ fileToDelete ->
           fileToDelete.delete();
       }
   }

   public static File findFile(String name){
       listFiles().each(){ fileToCheck ->

           if (fileToCheck.name.equals(name)){
               return fileToCheck
           }
       }
       return null
   }

}

然后在你的控制器中你可以做这样的事情......

class ReportController{

   def runReport = {
       File report = createReport() //<-- your method to create a report.
       ReportDirectory.addFile(report);

       redirect(action:"downloadFle" params:[fileName:report.name])

   }    


   def showAllFiles = {
       [files:ReportDirectory.listFiles()]
   }

   def downloadFile = {
      def fileName = params.fileName;

      def fileToDownload = ReportDirectory.findFile(fileName);

      if (fileToDownload){

      response.setContentType("application/octet-stream")
      response.setHeader("Content-disposition", "attachment;filename=${fileToDownload .getName()}")
      response.outputStream << fileToDownload.newInputStream()  //<-- ask the user to download
     }else{
         //handle when the file is not found
     }

   }

   def deleteAllFiles ={
       ReportDirectory.deleteAllFiles()

       [files:ReportDirectory.listFiles()] //<-- return the remaining files, if any.
   }


}

关于此解决方案的一些评论...

- 这不会解决MIME类型问题,因此浏览器无法确定哪种二进制数据通过网络传输。

这有用吗?

答案 1 :(得分:0)

应用程序目录不用于存储任何数据。

顺便说一句,您可以将其存储在其他任何地方,然后创建一些知道文件存储位置的DownloadController,并根据请求将其发送到浏览器。

在大多数情况下,Grails应用程序位于前端(如nginx)后面,因此,在这种情况下,配置前端直接从存储它们的目录提供此文件会更容易