Skip to main content
Example scripts
arrow icon
To homepage
Jira
Data centre icon
Data Center

Create a custom REST endpoint that can receive file uploads

Created 1 year ago, Updated 5 month(s) ago
App in script
ScriptRunner For Jira
ScriptRunner For Jira
by Adaptavist
Compatibility
compatibility bullet
Jira (8.0 - 8.19)
compatibility bullet
ScriptRunner For Jira (7.10.0)
Language |
groovy
import com.adaptavist.hapi.jira.issues.Issues
import com.onresolve.scriptrunner.runner.rest.common.CustomEndpointDelegate
import groovy.transform.BaseScript
import org.apache.commons.fileupload.disk.DiskFileItemFactory
import org.apache.commons.fileupload.servlet.ServletFileUpload

import javax.servlet.http.HttpServletRequest
import javax.ws.rs.core.MultivaluedMap
import javax.ws.rs.core.Response
import java.nio.file.Files

@BaseScript CustomEndpointDelegate delegate

fileUpload(httpMethod: "POST", groups: ['jira-users']) { MultivaluedMap queryParams, HttpServletRequest request ->

    if (ServletFileUpload.isMultipartContent(request)) {
        def factory = new DiskFileItemFactory()
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")))

        def upload = new ServletFileUpload(factory)

        def fileItems = upload.parseRequest(request)

        fileItems.each { fileItem ->
            // do something with each fileItem -

            // for example, you can get the name:
            // fileItem.name

            // the contents:
            // fileItem.inputStream

            // or write to another file:
            // fileItem.write(new File('/tmp/myfile.png'))

            // purely as an example, the following code demonstrates attaching each file to an existing issue
            def tempDirectory = Files.createTempDirectory(null)
            try {
                def attachmentFile = new File(tempDirectory.toFile(), fileItem.name)
                fileItem.write(attachmentFile)
                Issues.getByKey('SR-1').addAttachment(attachmentFile)

            } finally {
                tempDirectory.deleteDir()
            }
        }
    }

    Response.noContent().build()
}
Having an issue with this script?
Report it here