2011-07-22 3 views

Répondre

1

possible duplicate ?

Vous pouvez stocker les fichiers où vous le souhaitez, mais n'oubliez pas le répertoire dans lequel vous stockez les fichiers afin qu'ils ne prennent pas tout l'espace disque si vous ne les nettoyez pas activement.

donc, voici ce que je ferais si vous voulez stocker les fichiers et permettre à l'utilisateur de les télécharger maintenant ou plus tard (pas testé et il pourrait être mieux, mais montre le concept) ...

créer une classe qui représente votre répertoire de rapports

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 
    } 

} 

Ensuite, dans votre contrôleur, vous pouvez faire des choses comme ça ....

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. 
    } 


} 

Quelques commentaires sur cette solution ...

-ce qui ne concerne pas les types MIME, de sorte que le navigateur ne sera pas en mesure de déterminer quel type de données binaires arrive sur le réseau.

est-ce utile?

0

Le répertoire d'applications n'est pas conçu pour stocker des données.

BTW, vous pouvez le stocker n'importe où ailleurs, puis créer quelques DownloadController qui savent où les fichiers sont stockés, et l'envoyer au navigateur sur demande.

Comme dans la plupart des cas, l'application Grails se trouvent derrière un frontend (comme nginx), donc, à cette situation, il est beaucoup plus facile de configurer frontend pour servir ces fichiers directement dans le répertoire où vous les rangez

+0

merci splix .. sonne bien .. – maaz

Questions connexes