Где хранить временные файлы в приложении Grails? - PullRequest
0 голосов
/ 22 июля 2011

в моем приложении grails с использованием jasper Reports. Я создаю отчет в формате pdf, я хочу сделать его доступным для скачивания ... в каком каталоге моего приложения мне нужно сохранить файл ...? заранее спасибо

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Возможно дублировать ?

Вы можете хранить файлы где угодно, но помните о каталоге, в котором вы храните файлы, чтобы они не заняли всеместа на диске, если вы не выполняете их активную очистку.

Итак, вот что я хотел бы сделать, если вы хотите сохранить файлы и позволить пользователю загружать их сейчас или позже ( не проверено и можетбыть лучше, но показывает концепцию ) ...

создать класс, который представляет ваш каталог отчетов

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-типам, поэтому браузер не сможет выяснить, что это за двоичные данныеидет по проводу.

это полезно?

0 голосов
/ 22 июля 2011

Каталог приложения не предназначен для хранения каких-либо данных.

Кстати, вы можете сохранить его где-нибудь еще, затем создать несколько DownloadController, которые будут знать, где хранятся файлы, и отправить их в браузер по запросу.

Поскольку в большинстве случаев приложение Grails находится за внешним интерфейсом (например, nginx), поэтому в этой ситуации гораздо проще настроить внешний интерфейс для обслуживания этих файлов непосредственно из каталога, в котором вы их храните

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...