First, include commons-net in your BuildConfig.groovy (Grails 2.x) or build.gradle (Grails 3.x):
compile 'commons-net:commons-net:3.3'
Secondly add a service:
class UploadService {
GrailsApplication grailsApplication
String upload(String fileName, InputStream inputStream) {
String status
new FTPClient().with {
connect grailsApplication.config.getProperty('ftp.host')
login grailsApplication.config.getProperty('ftp.username'), grailsApplication.config.getProperty('ftp.password')
enterLocalPassiveMode()
setFileType(BINARY_FILE_TYPE)
changeWorkingDirectory grailsApplication.config.getProperty('ftp.uploadDir')
storeFile(fileName, inputStream)
status = replyString
disconnect()
}
return status
}
}
Update:
I forgot to add the configuration that needs to go into grails-app/conf/Config.groovy
(Grails 2.x) or grails-app/config/application.groovy
:
ftp {
host = 'some.host'
username = 'myuser'
password = '*****'
uploadDir = 'Uploads'
}
It would also be possible to create the FTPClient() instance in resources.groovy
and use dependency injection instead.
bean = {
ftpClient(FTPClient)
}
and then have this in the service:
class UploadService {
GrailsApplication grailsApplication
FTPClient ftpClient // Will be injected
String upload(String fileName, InputStream inputStream) {
String status
ftpClient.with {
// Same as above
}
}
}
Which would allow you to unit-test the class, where you simply mock out FTPClient