source: trunk/grails-app/controllers/nl/tno/metagenomics/files/FileController.groovy @ 2

Last change on this file since 2 was 2, checked in by robert@…, 8 years ago

Initial import of basic functionality

File size: 4.1 KB
Line 
1/**
2 * FileController
3 *
4 * Handles file uploads and downloads
5 *
6 * @author      Robert Horlings
7 * @since       20100601
8 * @package     dbnp.studycapturing
9 *
10 * Revision information:
11 * $Rev: 1182 $
12 * $Author: robert@isdat.nl $
13 * $Date: 2010-11-22 17:27:23 +0100 (Mon, 22 Nov 2010) $
14 */
15package nl.tno.metagenomics.files
16
17import org.codehaus.groovy.grails.commons.ConfigurationHolder
18import grails.converters.*
19import org.apache.commons.io.IOUtils;
20
21class FileController {
22
23        def fileService;
24
25        /**
26         * Returns the file that is asked for from the temporary upload directory
27         * or a 404 error if the file doesn't exist
28         */
29        def get = {
30                retrieveFile( params, fileService.getUploadDir() );
31        }
32
33        /**
34         * Deletes the file that is asked for from the temporary upload directory
35         * or a 404 error if the file doesn't exist
36         */
37        def delete = {
38                File directory = fileService.getUploadDir()
39                String filename = checkFile( params, directory );
40               
41                try {
42                        fileService.delete( filename, directory );
43                        render ''
44                } catch( Exception e ) {
45                        response.status = 500;
46                        render e.getMessage();
47                }
48        }
49
50        /**
51         * Returns the file that is asked for from the temporary upload directory
52         * or a 404 error if the file doesn't exist
53         */
54        def getPermanent  = {
55                retrieveFile( params, fileService.absolutePath( ConfigurationHolder.config.metagenomics.fileDir ) );
56        }
57
58        private void retrieveFile( params, directory ) {
59                String filename = checkFile( params, directory );
60                def file = fileService.get( filename, directory );
61
62                //response.setContentType("application/octet-stream")
63                //response.setContentType( "image/jpeg" );
64
65                // Return the file
66                response.setHeader "Content-disposition", "attachment; filename=${filename}"
67                response.outputStream << file.newInputStream()
68                response.outputStream.flush()
69        }
70
71        private String checkFile( params, directory ) {
72                def fileExists;
73
74                // Filename is not url decoded for some reason
75                def coder = new org.apache.commons.codec.net.URLCodec()
76                def filename = coder.decode(params.id)
77
78                if( !filename ) {
79                        response.status = 404;
80                        render( "File not found" );
81                        return;
82                }
83
84                // Security check to prevent accessing files in other directories
85                if( filename.contains( '..' ) ) {
86                        response.status = 500;
87                        render "Invalid filename given";
88                        return;
89                }
90
91                try {
92                        fileExists = fileService.fileExists( filename, directory )
93                } catch( FileNotFoundException e ) {
94                        fileExists = false;
95                }
96                if( !filename || !fileExists ) {
97                        response.status = 404;
98                        render( "File not found" );
99                        return;
100                }
101               
102                return filename;
103        }
104
105        /**
106         * Uploads a file and returns the filename under which the file is saved
107         */
108        def upload = {
109                // If an old file exists, delete it
110                if( params.get( 'oldFile' ) ) {
111                        fileService.delete( params.get( 'oldFile' ) );
112                }
113
114                render moveUploadedFile( fileService. getUploadDir() ) as JSON
115        }
116
117        protected def moveUploadedFile(File absolutePath ) {
118                PrintWriter writer = null;
119                InputStream is = null;
120                FileOutputStream fos = null;
121
122                try {
123                        writer = response.getWriter();
124                } catch (IOException ex) {
125                        log(OctetStreamReader.class.getName() + "has thrown an exception: " + ex.getMessage());
126                }
127
128                String filename = request.getHeader("X-File-Name");
129
130                // URL decode the filename
131                def coder = new org.apache.commons.codec.net.URLCodec()
132                filename = coder.decode(filename)
133
134                String newFilename = fileService.getUniqueFilename( filename, absolutePath );
135                try {
136                        is = request.getInputStream();
137                        fos = new FileOutputStream(new File(absolutePath, newFilename));
138                        IOUtils.copy(is, fos);
139                        response.setStatus(response.SC_OK);
140                        return [ 'success': true, 'filename': newFilename ]
141                } catch (FileNotFoundException ex) {
142                        response.setStatus(response.SC_INTERNAL_SERVER_ERROR);
143                        log(OctetStreamReader.class.getName() + "has thrown an exception: " + ex.getMessage());
144
145                        return [ 'success': false ]
146                } catch (IOException ex) {
147                        response.setStatus(response.SC_INTERNAL_SERVER_ERROR);
148                        log(OctetStreamReader.class.getName() + "has thrown an exception: " + ex.getMessage());
149
150                        return [ 'success': false ]
151                } finally {
152                        try {
153                                fos.close();
154                                is.close();
155                        } catch (IOException ignored) {
156                        }
157                }
158        }
159
160
161}
Note: See TracBrowser for help on using the repository browser.