Forums

Articles
Create
cancel
Showing results for 
Search instead for 
Did you mean: 

uploading a user avatar with scriptrunner

Daniel Garcia
Contributor
June 27, 2018

I've got image data in base64 strings and want to set user avatars to that image. e.g.

data:image/jpg;base64,/9j/4AA... ...KR//9k=

My current code runs without error and appears to work, except the image isn't loaded correctly. The current avatar is replaced with

useravatar.png

What I'm doing is

Pattern reImage = Pattern.compile('^data\\:(.*?);base64,(.*)$')
def m4 = reImage.matcher(imageraw)
if (m4) {
String imageType = m4[0][1]
String imageB64 = m4[0][2]
byte[] imageBA = imageB64.decodeBase64()
ByteArrayInputStream bais = new ByteArrayInputStream(imageBA)
BufferedImage image = ImageIO.read(bais)
bais.close()
//I've cropped, resized and saved the image and it all works. This tells me the BufferedImage is loaded well
imageFileName = 'somefile.ext' // logic is a bit more complex but this will do for the example
Avatar newAvatar = avatarManager.create(
imageFileName,
imageType,
IconType.USER_ICON_TYPE,
new IconOwningObjectId(user.id.toString()),
new ByteArrayInputStream(imageBA),
null) //I've also tested with a non null Selection
//The returned avatar has a non 0 id, and other values are as expected
avatarService.setCustomUserAvatar(currentUser,user,newAvatar.id)
}

 

1 answer

Suggest an answer

Log in or Sign up to answer
0 votes
scott_boisvert
Community Champion
January 9, 2020

@Daniel Garcia I'm running into the same issue, were you ever able to figure this out?

scott_boisvert
Community Champion
January 9, 2020

Disregard figured it out. Problem was the user.

Where you have 

new IconOwningObjectId(user.id.toString())

It should be:

new IconOwningObjectId(user.getUsername())

Provided user is of type ApplicationUser 

scott_boisvert
Community Champion
January 9, 2020
import com.atlassian.jira.avatar.Avatar
import com.atlassian.jira.avatar.AvatarManager
import com.atlassian.jira.avatar.AvatarService
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.icon.IconType
import com.atlassian.jira.icon.IconOwningObjectId

ApplicationUser user = ComponentAccessor.getUserManager().getUserByName("bill")

def fileName = "bill.png"
File file = new File("/data/atlassian/application-data/jira/scripts/data/bill.png")
def contentType = AvatarManager.PNG_CONTENT_TYPE
IconType iconType = IconType.USER_ICON_TYPE
IconOwningObjectId owner = new IconOwningObjectId(user.getUsername())
BufferedInputStream iStream = new BufferedInputStream(new FileInputStream(file))
AvatarManager avatarManager = ComponentAccessor.getAvatarManager()
Avatar avatar = avatarManager.create(fileName, contentType, iconType, owner, iStream, null)

AvatarService avatarService = ComponentAccessor.getAvatarService()
avatarService.setCustomUserAvatar(user, user, avatar.getId())
A C
I'm New Here
I'm New Here
Those new to the Atlassian Community have posted less than three times. Give them a warm welcome!
April 24, 2020

Hi Scott,

good and useful script!

Anyway I had to subsitute

new IconOwningObjectId(user.getUsername())

with

new IconOwningObjectId(user.getKey())

With this expedient your script worked like a charm!

Thanks,

Alberto

TAGS
AUG Leaders

Atlassian Community Events