Reading JSON object from txt file in Groovy - grails

I am trying to collect a JSON from a txt file. But my below code seems to keep giving me "nullPointerException".
File f = new File(tempDir+File.separator+'jsonObject.txt')
if (f){
log.error " file exists $f"
FileReader f2 = new FileReader(f);
log.error " file data- $f2"
if (f2 == null) {
//do something
} else {
JsonSlurper jsonParser = new JsonSlurper();
game = jsonParser.parse(new FileReader(f));
}
}
SOLUTION FOUND
Reading a json txt file:
File f = new File(tempDir+File.separator+'jsonObject.txt')
def slurper = new JsonSlurper()
def jsonText = f.getText()
json = slurper.parseText( jsonText )
Writing json to a file:
File g = new File(tempDir+File.separator+'jsonObject.txt')
g.createNewFile()
def json = new JsonBuilder()
json {
"result" result
}
g.setText(json.toString())

Please, try this:
import groovy.json.JsonSlurper
def inputFile = new File("D:\\yourPath\\json.txt")
def InputJSON = new JsonSlurper().parseText(inputFile.text)
InputJSON.each{ println it }

try:
File f = new File( tempDir, 'jsonObject.txt' )
if( f.exists() ) {
def game = f.withReader { r ->
new JsonSlurper().parse( r )
}
println game
}

Try simple and optimized solution:
import groovy.json.JsonSlurper
try {
File inputFile = new File("your_file_path")
def slurper = new JsonSlurper()
def data = slurper.parse(inputFile)
} catch (Exception e) {
e.printStackTrace()
}

parseFile can take a file as an input:
import groovy.json.JsonSlurper
def inputFile = new File("/your/path/my.json")
def InputJSON = new JsonSlurper().parseFile(inputFile, 'UTF-8')
InputJSON.each{ println it }

Related

groovy: 139: unable to resolve class XmlParser

When trying to run the groovy script from Jenkins getting the below error
C:\Jenkins\workspace\Load-Test-for-container-HimaM13\hudson16255048887172875424.groovy: 139: unable to resolve class XmlParser # line 139, column 14.
def root = new XmlParser().parseText(response)
^
Groovy version used groovy-4.0.0-rc-2
Code snippet
try {
String response = sendSoap(request, "getSamlArtifact")
def soapNS = new groovy.xml.Namespace("http://schemas.xmlsoap.org/soap/envelope/", "SOAP")
def samlProtocolNS = new groovy.xml.Namespace("urn:oasis:names:tc:SAML:1.0:protocol", "samlp")
def root = new XmlParser().parseText(response)
def assertionArtifact = root[soapNS.Body][samlProtocolNS.Response][samlProtocolNS.AssertionArtifact]
if (null == assertionArtifact[0]){
//printString("value1-"+assertionArtifact[0])
return null
}
else
return assertionArtifact[0].text();
} catch (IOException e) {
return null
}
it worked after trying with
def root = new groovy.xml.XmlParser().parseText(response)
instead of
def root = new XmlParser().parseText(response)

How to change the Git URL in all Jenkins jobs

Does anyone have an updated version of ceilfors answer that works for both AbstractProject and WorkflowJob?
This is the solution I came up with. It was tested on Jenkins 2.355
The test was run from the script console.
For testing purposes, I limited the test to one Freestyle (AbstractProject) and one Pipeline (WorkflowJob) job each. You would need to modify the code below.
I hope others find this useful
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
import hudson.plugins.git.*
import jenkins.*
import jenkins.model.*
def modifyGitUrl(url) {
def updatedUrl = url.toString().replace("git#gitlab", "git#github")
// println "updatedUrl = ${updatedUrl}"
return updatedUrl
}
Jenkins.instance.getAllItems(Job.class).each {
project = it.getFullName()
if(project.toString().equals("PL_Quick_Testing") || project.toString().equals("A_Freestyle_Job")) {
try {
if (it instanceof AbstractProject){
def oldScm = it.scm
def newUserRemoteConfigs = oldScm.userRemoteConfigs.collect {
new UserRemoteConfig(modifyGitUrl(it.url), it.name, it.refspec, it.credentialsId)
}
def newScm = new GitSCM(newUserRemoteConfigs, oldScm.branches, oldScm.doGenerateSubmoduleConfigurations,
oldScm.submoduleCfg, oldScm.browser, oldScm.gitTool, oldScm.extensions)
it.scm = newScm
it.save()
println "Done"
} else if (it instanceof WorkflowJob) {
def oldScm = it.getTypicalSCM()
def definition = it.getDefinition()
String scriptPath = it.getDefinition().getScriptPath()
def newUserRemoteConfigs = oldScm.userRemoteConfigs.collect {
new UserRemoteConfig(modifyGitUrl(oldScm.userRemoteConfigs.url[0]), it.name, it.refspec, it.credentialsId)
}
def newScm = new GitSCM(newUserRemoteConfigs, oldScm.branches, oldScm.doGenerateSubmoduleConfigurations,
oldScm.submoduleCfg, oldScm.browser, oldScm.gitTool, oldScm.extensions)
def newDefinition = new org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition(newScm, scriptPath)
it.definition = newDefinition
it.save()
println "Done"
} else {
println("${project} has no SCM")
}
} catch (Exception e) {
// e.printStackTrace()
}
}
}

NPE after grails clean

The application works just fine, but after grails clean it starts throwing an error if I execute grails war or grail web-app:
|Loading Grails 2.4.3
|Configuring classpath
.
|Environment set to production
.................................
|Packaging Grails application
..
|Compiling 18 source files
.Error
|
Compilation error: startup failed:
General error during class generation: NPE while processing BcvjobService.groovy
groovy.lang.GroovyRuntimeException: NPE while processing BcvjobService.groovy
at org.codehaus.groovy.classgen.AsmClassGenerator.visitClass(AsmClassGenerator.java:252)
at org.codehaus.groovy.control.CompilationUnit$16.call(CompilationUnit.java:805)
at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1047)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:583)
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:561)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:538)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:517)
at org.codehaus.groovy.tools.FileSystemCompiler.compile(FileSystemCompiler.java:59)
at org.codehaus.groovy.tools.FileSystemCompiler.doCompilation(FileSystemCompiler.java:215)
at org.codehaus.groovy.ant.Groovyc.runCompiler(Groovyc.java:1161)
at org.codehaus.groovy.ant.Groovyc.compile(Groovyc.java:1212)
at org.codehaus.groovy.grails.compiler.Grailsc.compile(Grailsc.java:78)
at org.codehaus.groovy.ant.Groovyc.execute(Groovyc.java:827)
...
Googling didn't help in the least, so I can't even understand where to start, and any help would be greatly appreciated.
Here is BcvjobService.groovy:
package bcvapp
import grails.transaction.Transactional
import groovy.lang.Closure;
import groovy.io.FileType
import groovy.util.AntBuilder
import java.awt.event.ItemEvent;
import java.util.List;
import java.util.regex.Pattern;
import grails.util.Mixin
import grails.util.Holders
import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH
#Transactional
#Mixin(ServiceCategory)
class BcvjobService {
def mailService
def holderService
def servletContext = SCH.servletContext
def String absPath = getAbsPath()
def String configPath = servletContext.getRealPath("/pipeline/bcvrun.prj.xml")
def outputMap = [:]
def prepareDirectory(Bcvjob job, String sessionId, List fileList, List directionList, Integer queueSize){
def configFile = new File (configPath)
def defaultConfig = new XmlParser().parse(configFile)
// Create directory structure
def inputLine = defaultConfig.BCV_Input
def input = inputLine.text().replaceAll(Pattern.compile('[\\.\\/\\\\]'), '')
def outputLine = defaultConfig.BCV_Output
def output = outputLine.text().replaceAll(Pattern.compile('[\\.\\/\\\\]'), '')
def folderPath = "${absPath}${sessionId}"
def inputPath = folderPath + "/" + input
def outputPath = folderPath + "/" + output
addResultsPath(sessionId, outputPath)
inputLine[0].value = inputPath
outputLine[0].value = outputPath
def inpath = defaultConfig.InPath // why there are two almost identical lines in bcv config?
inpath[0].value = inputPath
new File (inputPath).mkdirs()
new File (outputPath).mkdir()
new File(outputPath + "/simple_results.html").createNewFile()
File res = new File(outputPath + "/simple_results.html")
if (queueSize > 2 ){
res << ("Your task was submitted at ${new Date()}<p>")
res << ("Waiting in queue..<p>")
res << ("Please, bookmark this page to see the results later. Refresh the page to check if they are ready.")
}
else {
res << ("Your task was submitted at ${new Date()}<p>")
res << ("Running..<p>")
res << ("Please, bookmark this page to see the results later. Refresh the page to check if they are ready.")
}
res << ("<script>")
res << ("var interval = setInterval('location.reload()', '30000');")
res << ("</script>")
for (f in fileList){
new File (outputPath + "/" + f.getOriginalFilename().replaceAll(Pattern.compile('\\..*'), '').replaceAll("\\s+", "_")).mkdir()
}
uploadFiles(inputPath, fileList)
// Write custom configuration file
def vocabulary = defaultConfig.Vocabulary
def vocabularyPath = vocabulary[0].text().substring(0, vocabulary[0].text().lastIndexOf("/")+1)
def vocabularyName = job.vocabulary.replaceAll(/\s+/, "_")
vocabulary[0].value = vocabularyPath + vocabularyName + ".seq.fas"
def reads = defaultConfig.READS.find{'READS'}
reads.children.clear()
def counter = 0
for (f in fileList){
def stringDirection
if (directionList.get(counter) == "r"){
stringDirection = "reverse"
}
else stringDirection = "forward"
reads.appendNode('Read', [name:f.getOriginalFilename().replaceAll("\\s+", "_")]).appendNode('Direction', stringDirection)
counter++
}
def taxdb = defaultConfig.Database
if (job.taxdb == "full"){
taxdb[0].value = "all"
}
else if (job.taxdb == "named isolates"){
taxdb[0].value = "named"
}
def distance = defaultConfig.DistanceThreshold
distance[0].value = job.distance.toFloat()
def email = defaultConfig.Email
email[0].value = job.email
def mode = defaultConfig.Mode
mode[0].value = "PIPELINE"
def writer = new StringWriter()
def printer = new XmlNodePrinter(new PrintWriter(writer))
printer.with {
preserveWhitespace = true
expandEmptyElements = true
}
printer.print(defaultConfig)
def result = writer.toString()
new File(folderPath + "/bcvrun.prj.xml").write(result)
return outputPath
}
def Closure getWaitingPipeline = {Bcvjob job ->
def queueSize = Bcvjob.countByDateCreatedLessThanEquals(job.dateCreated) + Stapjob.countByDateCreatedLessThanEquals(job.dateCreated)
if(queueSize > 2){
println (" bcv waiting in queue; sessionId ${job.sessionId} time ${System.currentTimeMillis()}")
while (queueSize > 2){ // 1 running task + our task
sleep(5000)
queueSize = Bcvjob.countByDateCreatedLessThanEquals(job.dateCreated) + Stapjob.countByDateCreatedLessThanEquals(job.dateCreated)
}
println (" bcv finished waiting in queue; sessionId ${job.sessionId} time ${System.currentTimeMillis()}")
def res = new File(getResults(job.sessionId)).newWriter()
res.write("Your task was submitted at ${new Date()}<p>")
res.write("Running..<p>")
res.write("Please, bookmark this page to see the results later. Refresh the page to check if they are ready.")
res.close()
}
def returnCode = runPipeline(job.sessionId)
println (" bcv waiting pipeline finished; sessionId ${job.sessionId} time ${System.currentTimeMillis()}")
if (returnCode != 143){
zipResults(job.sessionId)
println (" bcv waiting results zipped; sessionId ${job.sessionId} time ${System.currentTimeMillis()}")
}
if (returnCode == 0){
if (job.email) {
sendResults(job.email, job.sessionId)
println (" bcv waiting results sent; sessionId ${job.sessionId} time ${System.currentTimeMillis()}")
}
}
else {
if (job.email) {
sendLogs(job.email, job.sessionId)
println (" bcv bad news sent; sessionId ${job.sessionId} time ${System.currentTimeMillis()}")
}
else if (returnCode != 143) {
sendLogs(job.sessionId) // send to weidewind
}
else {
println (" user left; sessionId ${job.sessionId} ")
}
}
def sessionId = job.sessionId
job.delete(flush:true)
holderService.setDone(sessionId)
}
def Closure getPipeline = {Bcvjob job ->
def returnCode = runPipeline(job.sessionId)
println (" bcv pipeline finished; sessionId ${job.sessionId} time ${System.currentTimeMillis()}")
if (returnCode != 143){
zipResults(job.sessionId)
println (" bcv results zipped; sessionId ${job.sessionId} time ${System.currentTimeMillis()}")
}
if (returnCode == 0){
if (job.email) {
sendResults(job.email, job.sessionId)
println (" bcv results sent; sessionId ${job.sessionId} time ${System.currentTimeMillis()}")
}
}
else {
if (job.email) {
sendLogs(job.email, job.sessionId, returnCode)
println (" bcv bad news sent; sessionId ${job.sessionId} time ${System.currentTimeMillis()}")
}
else if (returnCode != 143) {
sendLogs(job.sessionId) // send to weidewind
}
else {
println (" user left; sessionId ${job.sessionId} ")
}
}
def sessionId = job.sessionId
job.delete(flush:true)
holderService.setDone(sessionId)
}
private def addResultsPath(String sessionId, String outputPath){
outputMap.putAt(sessionId, outputPath)
}
def runPipeline(String sessionId){
println (" going to run bcv pipeline, sessionId ${sessionId}")
def command = "perl /store/home/popova/Programs/BCV_pipeline/pipeline.pl ${absPath}${sessionId} bcvrun.prj.xml >${absPath}pipelinelog.txt >2${absPath}pipelinerr.txt"// Create the String
holderService.procs[sessionId] = command.execute() // Call *execute* on the string
holderService.procs[sessionId].consumeProcessOutput( System.out, System.err ) //31.10
holderService.procs[sessionId].waitFor() // Wait for the command to finish
def exitValue = holderService.procs[sessionId].exitValue()
println "return code " + exitValue
holderService.deleteProc(sessionId)
return exitValue
}
def uploadFiles(String uploadPath, List fileList){
for (f in fileList){
if(f instanceof org.springframework.web.multipart.commons.CommonsMultipartFile){
def fileName = f.getOriginalFilename().replaceAll("\\s+", "_")
new FileOutputStream(uploadPath + "/" + fileName).leftShift( f.getInputStream() )
} else {
log.error("wrong attachment type [${f.getClass()}]");
}
}
}
def uploadSequenceFiles(String uploadPath, List fileList){
for (f in fileList){
if(f instanceof org.springframework.web.multipart.commons.CommonsMultipartFile){
def fileName = f.getOriginalFilename().replaceAll("\\s+", "_")
new FileOutputStream(uploadPath + "/" + fileName.replaceAll(Pattern.compile('\\..*'), '') + "/" + fileName).leftShift( f.getInputStream() )
} else {
log.error("wrong attachment type [${f.getClass()}]");
}
}
}
def sendResults(String email, String sessionId) {
def results = getZipResults(sessionId)
println "going to send files, sessionID ${sessionId} resultsPath ${results} time ${System.currentTimeMillis()}"
mailService.sendMail {
multipart true
to email
subject "BCV results"
body "Thanks for using BCV!\n Here are your results. \n Have a nice day!"
attachBytes 'results.zip','application/zip', new File(results).readBytes()
}
}
def sendExampleResults(String email, String folderName){
def results = getStorePath() + folderName + "/results.zip"
println "going to send files, folderName ${folderName} resultsPath ${results} time ${System.currentTimeMillis()}"
mailService.sendMail {
multipart true
to email
subject "Example BCV results"
body "Thanks for using BCV!\n Here are your example results. \n Have a nice day!"
attachBytes 'results.zip','application/zip', new File(results).readBytes()
}
}
def sendLogs(String email, String sessionId) {
//def logs = "${absPath}${sessionId}logfile"
def results = getZipResults(sessionId)
println "going to send logs, sessionID ${sessionId} logPath ${logs} time ${System.currentTimeMillis()}"
mailService.sendMail {
multipart true
to email
subject "BCV failed"
body "We are very sorry, but something has gone amiss. Here are some of your results, though."
attachBytes 'results.zip','application/zip', new File(results).readBytes()
}
//just in case there is no results at all and results.zip does not exist. Todo: catch mailService or zip exception
//else user left, auto-termination
mailService.sendMail {
multipart true
to "weidewind#gmail.com"
subject "BCV failed"
body "Achtung! email: ${email}, sessionId: ${sessionId}"
}
mailService.sendMail {
multipart true
to "weidewind#gmail.com"
subject "BCV failed"
body "Achtung! email: ${email}, sessionId: ${sessionId}"
attachBytes 'results.zip','application/zip', new File(results).readBytes()
}
println (" bcv bad news sent to webmaster; sessionId ${job.sessionId} time ${System.currentTimeMillis()}")
}
def sendLogs(String sessionId){
//just in case there is no results at all and results.zip does not exist. Todo: catch mailService or zip exception
mailService.sendMail {
multipart true
to "weidewind#gmail.com"
subject "BCV failed"
body "Achtung! sessionId: ${sessionId}"
}
println (" bcv bad news sent to webmaster; sessionId ${sessionId} time ${System.currentTimeMillis()}")
}
def zipResults(String sessionId){
def output = getOutput(sessionId)
def results = getZipResults(sessionId)
println "going to zip files, sessionID ${sessionId} time ${System.currentTimeMillis()}"
println (output)
def p = ~/.*\.(svg|html|with_names|cluster\.fasta)/
def filelist = []
def outputDir = new File(output)
outputDir.eachDir { chrom ->
def chromDir = new File(chrom.absolutePath)
chromDir.eachFileMatch(FileType.FILES, p){ tree ->
def splittedPath = tree.absolutePath.split('/')
println ("going to add ${splittedPath[splittedPath.size()-2]}/${splittedPath[splittedPath.size()-1]} from ${output} to zip list; sessionId ${sessionId}")
filelist.add("${splittedPath[splittedPath.size()-2]}/${splittedPath[splittedPath.size()-1]}")
}
}
filelist.add("simple_results.html")
println("results will be placed here ${results}")
def zipFile = new File("${results}")
new AntBuilder().zip( basedir: output,
destFile: zipFile.absolutePath,
includes: filelist.join( ' ' ) )
}
def getResults (String sessionId){
return outputMap.getAt(sessionId) + "/simple_results.html"
}
def getOutput(String sessionId){
return outputMap.getAt(sessionId)
}
def getZipResults(String sessionId){
return outputMap.getAt(sessionId) + "/results.zip"
}
def getExampleFolderName(List fileList){
def exampleFileNames = []
for (f in fileList){
exampleFileNames.add(f.name)
}
exampleFileNames.sort()
def folderName = ""
for (f in exampleFileNames){
folderName = folderName + (f.replaceAll(Pattern.compile('\\..*'), ''))
}
println folderName
return folderName
}
def checkInput(Bcvjob job, List fileList){
String errorMessage = ""
if (!job.validate()) {
errorMessage = "Some errors occured: "
job.errors.each {
errorMessage += "<p>" + it + "</p>"
}
//if (!isFloat(job.distance) || job.distance.toFloat() < 0 || job.distance.toFloat() > 0.1){
if ( job.distance < 0 || job.distance > 0.1){
errorMessage += "<p> Maximum distance must not be less than 0 or more than 0.1 </p>"
}
if (job.errors.hasFieldErrors("email")){
errorMessage += "<p>Your e-mail does not seem valid </p>"
}
if (job.errors.hasFieldErrors("files") || (fileList.size() == 0 & job.isExample == "false")){
errorMessage += "<p>Select at least one file </p>"
}
}
if (fileList.size() > 10){
errorMessage += "<p>Please, do not select more than 10 files at once. </p>"
}
if (job.isExample == "false"){
for (f in fileList) {
def name = f.getOriginalFilename()
int dot= name.lastIndexOf(".");
if (name.substring(dot+1) != "ab1"){
errorMessage += "<p>Unsupported extension: ${name} </p>"
}
def bytes = f.getBytes()
if (bytes[0] != 'A' || bytes[1] != 'B' || bytes[2] != 'I' || bytes[3] != 'F' || !(bytes[4]+bytes[5] >= 101)){
errorMessage += "<p>Not ABI: ${name} </p>"
}
}
}
return errorMessage
}
def isFloat(String value)
{
try
{
Float.parseFloat(value);
return true;
} catch(NumberFormatException nfe)
{
return false;
}
}
def getAbsPath(){
return Holders.config.absPath
}
def getStorePath(){
return Holders.config.storePath
}
def talkWork(){
ServiceCategory.talkWork()
}
def talkQueue(){
ServiceCategory.talkQueue()
}
}

how to download an image from url in grails

Can anyone help me how to download an image from url in grails. Currently I am using the following code, but it is saving in current folder of the application. I want to download browser specific folder(like default folder which we download some file from web or saveAS)
def imageDownload() {
//imageURL = "http://www.google.com/images/logo.png"
String fullPath = params.imageURL
String baseName = FilenameUtils.getBaseName(fullPath);
String extension = FilenameUtils.getExtension(fullPath);
def fileName = baseName+"."+extension
def fileDoc = new File(fullPath);
def webUtils = WebUtils.retrieveGrailsWebRequest()
def response = webUtils.getCurrentResponse()
response.setContentType("application/png")
response.setHeader "Content-disposition", "attachment; filename=\"${fileName}\"";
def file = new FileOutputStream(fullPath.tokenize("/")[-1])
def out = new BufferedOutputStream(file)
out << new URL(fullPath).openStream()
out.close()
redirect(action: "imageDetails", params:params)
}
Need help, Thank you.
def downloadImage = {
def fileURL = "http://www.google.com/images/logo.gif"
def thisUrl = new URL(fileURL);
def connection = thisUrl.openConnection();
def dataStream = connection.inputStream
response.setContentType("application/octet-stream")
response.setHeader('Content-disposition', 'Attachment; filename=logo.gif')
response.outputStream << dataStream
response.outputStream.flush()
}
you can do it easily with a few groovy tricks:
URL urlCont = new URL(imageURL);
InputStream inStream = new BufferedInputStream(urlCont.openStream());
byte[] bytes = IOUtils.toByteArray(inStream);
def download() {
String fullPath = params.imageURL
String baseName = FilenameUtils.getBaseName(fullPath);
String extension = FilenameUtils.getExtension(fullPath);
def fileName = baseName+"."+extension
def webUtils = WebUtils.retrieveGrailsWebRequest()
def response = webUtils.getCurrentResponse()
response.setContentType("application/png")
response.setHeader "Content-disposition", "attachment; filename=\"${fileName}\"";
def outputStream = response.getOutputStream()
URL url = new URL(fullPath);
InputStream is = new BufferedInputStream(url.openStream());
byte[] buffer = new byte[1024];
int length=0;
while (-1!=(length=is.read(buffer)))
{
outputStream.write(buffer, 0, length);
}
outputStream.close();
is.close();
}
Thats all I am using..It is downloaded successfully...

delete an existing file in grails

I am saving image files in my web folder. But at the time of saving or suppose a user want to change his picture than i want to delete the old picture and save the new one with the same file name. But I am failing after trying. Can anyone please help me on this please? Here is all my action below :
my save action >>>
def savePicture = {
String message = ""
def user = User.findById(1)
def userId = user.id
MultipartHttpServletRequest mpr = (MultipartHttpServletRequest)request;
CommonsMultipartFile f = (CommonsMultipartFile) mpr.getFile("productPic");
def okcontents = ['image/png', 'image/jpeg', 'image/gif']
if (! okcontents.contains(f.getContentType())) {
message = "Avatar must be one of: ${okcontents}"
render(view:'uploadForm', model:[message: message])
return;
}
String type = f.getContentType().substring(6)
String baseImageName = java.util.UUID.randomUUID().toString();
baseImageName = "user${user.id}"
// Saving image in a folder assets/channelImage/, in the web-app, with the name: baseImageName
def downloadedFile = f //.getFile( "product.baseImage" )
String fileUploaded = fileUploadService.uploadFile( downloadedFile, "${baseImageName}.${type}", "assets/channelImage/" )
if( fileUploaded ){
user.avatarType = type
user.save()
message = "File Saved Successfully."
redirect(action: 'show', params: [userId: userId])
}
}
my service action where I am trying to delete before save >>>
def String uploadFile( MultipartFile file, String name, String destinationDirectory ) {
def serveletContext = ServletContextHolder.servletContext
def storagePath = serveletContext.getRealPath( destinationDirectory )
def storagePathDirectory = new File("${storagePath}/${name}").delete()
// Store file
if(!file.isEmpty()){
file.transferTo( new File("${storagePath}/${name}") )
println("Saved File: ${storagePath}/${name}")
return "${storagePath}/${name}"
}else{
println "File: ${file.inspect()} was empty"
return null
}
}
my show method in controller >>>
def show = {
Long uid = Long.parseLong(params.userId)
def avatarUser = User.get(uid)
String link = "user${avatarUser.id}.${avatarUser.avatarType}"
[link:link]
}
my view page >>>
<g:if test="${link}">
<img src="${resource(dir: 'assets/channelImage', file: "${link}")}" />
</g:if>

Resources