Skip to content

imagekit-developer/imagekit-go

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ImageKit.io

ImageKit.io Go SDK

CI codecov License: MIT Twitter Follow

Go SDK for ImageKit implements all the backend API, URL-generation, and other utility functions.

ImageKit is complete media storage, optimization, and transformation solution that comes with an image and video CDN. It can be integrated with your existing infrastructure - storage like AWS S3, web servers, your CDN, and custom domain names, allowing you to deliver optimized images in minutes with minimal code changes.

All methods except url generation and utility functions return a response with ResponseMetaData, which holds the raw response header, HTTP status code, and raw response body. The Response object also contains the Data attribute except when the underlying API call is not supposed to return any data such as delete file API.

Table of contents -

Version Support

SDK Version Go
1.x >=1.18

Installation

go get github.com/imagekit-developer/imagekit-go

Initialization

import (
    "github.com/imagekit-developer/imagekit-go"
)

// Using environment variables IMAGEKIT_PRIVATE_KEY, IMAGEKIT_PUBLIC_KEY and IMAGEKIT_ENDPOINT_URL
ik, err := ImageKit.New()

// Using keys in argument
ik, err := ImageKit.NewFromParams(imagekit.NewParams{
    PrivateKey: privateKey,
    PublicKey: publicKey,
    UrlEndpoint: urlEndpoint
})

Response Format

Results returned by functions that call backend API(such as media management, metadata, cache APIs) embeds raw response in ResponseMetaData, which can be used to get the response HTTP StatusCode, Header, and Body. The JSON response body is parsed to the appropriate SDK type and assigned to the Data attribute.

resp, err := ik.Metadata.FromFile(ctx, fileId)
log.Println(resp.ResponseMetaData.Header, resp.Data.Url)

Functions that do not get any response body from API do not include the Data attribute in the response. In such cases, only ResponseMetaData is available.

Error Handling

ImageKit API returns a non-2xx status code upon error. SDK defines the following errors in the API package based on the status code returned:

imagekit-go/api:
400: ErrBadRequest
401: ErrUnauthorized
403: ErrForbidden
404: ErrNotFound
429: ErrTooManyRequests
500, 502, 503, 504: ErrServer
default: "Undefined Error"

err can be tested using errors.Is

if errors.Is(err, api.ErrForbidden) {
    log.Println(err.Message)
}

See full documentation for further detail.

URL-generation

1. Using image path and image hostname or endpoint

This method allows you to create an URL to access a file using the relative file path and the ImageKit URL endpoint (urlEndpoint). The file can be an image, video, or any other static file supported by ImageKit.

import (
    ikurl "github.com/imagekit-developer/imagekit-go/url"
)

url, err := ik.Url(ikurl.UrlParam{
    Path: "/default-image.jpg",
    UrlEndpoint: "https://ik.imagekit.io/your_imagekit_id/endpoint/",
    Transformations: []map[string]any{
        {
            "width":  400,
            "height": 300,
            "rotation": 90,
        },
    },
})

This results in a URL like:

https://ik.imagekit.io/your_imagekit_id/endpoint/tr:h-300,w-400:rt-90/default-image.jpg

2. Using full image URL

This method allows you to add transformation parameters to an absolute URL. For example, if you have configured a custom CNAME and have absolute asset URLs in your database or CMS, you will often need this.

import (
    ikurl "github.com/imagekit-developer/imagekit-go/url"
)

url, err := ik.Url(ikurl.UrlParam{
    Src: "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg",
    Transformations: []map[string]any{
        {
            "width":  400,
            "height": 300,
            "rotation": 90,
        },
    },
})

This results in a URL like:

https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?tr=h-300,w-400:rt-90

UrlParam has the following options:

Option Description
Path Conditional. This is the path at which the image exists. For example, /path/to/image.jpg. Either the Path or Src parameter needs to be specified for URL generation.
Src Conditional. This is the complete URL of an image already mapped to ImageKit. For example, https://ik.imagekit.io/your_imagekit_id/endpoint/path/to/image.jpg. Either the Path or Src parameter needs to be specified for URL generation.
UrlEndpoint Optional. The base URL to be appended before the path of the image. If not specified, the URL Endpoint specified at the time of SDK initialization is used. For example, https://ik.imagekit.io/your_imagekit_id/endpoint/
Transformations Optional. An array of objects specifying the transformation to be applied in the URL. Different steps of a chained transformation can be specified as different objects of the array. The complete list of supported transformations in the SDK and some examples of using them are given later.
TransformationPosition Optional. The default value is Path, which places the transformation string as a path parameter in the URL. It can also be specified as query, which adds the transformation string as the URL's query parameter tr. If you use the Src parameter to create the URL, then the transformation string is always added as a query parameter.
NamedTransformation Optional. Specifies the name of a pre-defined transformation.
QueryParameters Optional. These are the other query parameters that you want to add to the final URL. These can be any query parameters and not necessarily related to ImageKit. Especially useful if you want to add some versioning parameters to your URLs.
Signed Optional. Boolean. Default is false. If set to true, the SDK generates a signed image URL adding the image signature to the image URL. If you create a URL using the Src parameter instead of Path, then do correct UrlEndpoint for this to work. Otherwise returned URL will have the wrong signature
ExpireSeconds Optional. Integer. Meant to be used along with the Signed parameter to specify the time in seconds from now when the URL should expire. If specified, the URL contains the expiry timestamp in the URL, and the image signature is modified accordingly.

Examples of generating URLs

1. Chained Transformations as a query parameter

params := ikurl.UrlParam{
    Path:        "default-image.jpg",
    UrlEndpoint: "https://ik.imagekit.io/demo-id/",
    Transformations: []map[string]any{
        {
            "height": 300,
            "width":  400,
        },
        {
            "rotation": 90,
        },
    },
    TransformationPosition: ikurl.QUERY,
},

url, err := ik.Url(params)

2. Sharpening and contrast transform and a progressive JPG image

Some transform like Sharpening can be added to the URL with or without any other value. To use such transforms without specifying a value, specify the value as "-" in the transformation object. Otherwise, specify the value that you want to be added to this transformation.

params := ikurl.UrlParam{
    Path:        "default-image.jpg",
    UrlEndpoint: "https://ik.imagekit.io/demo-id/",
    Transformations: []map[string]any{
        {
            "effectSharpen": "-",
        },
    },
}

3. Adding overlays

ImageKit.io enables you to apply overlays to images and videos using the raw parameter with the concept of layers. The raw parameter facilitates incorporating transformations directly in the URL. A layer is a distinct type of transformation that allows you to define an asset to serve as an overlay, along with its positioning and additional transformations.

Text as overlays

You can add any text string over a base video or image using a text layer (l-text).

For example:

params := ikurl.UrlParam{
    Path:        "default-image.jpg",
    UrlEndpoint: "https://ik.imagekit.io/demo-id/",
    Transformations: []map[string]any{
        {
            "height": 300,
            "width":  400,
            "raw": "l-text,i-Imagekit,fs-50,l-end"
        },
    },
}

Sample Result URL

https://ik.imagekit.io/demo-id/default-image.jpg?tr=h-300,w-400,l-text,i-Imagekit,fs-50,l-end

Image as overlays

You can add an image over a base video or image using an image layer (l-image).

For example:

params := ikurl.UrlParam{
    Path:        "default-image.jpg",
    UrlEndpoint: "https://ik.imagekit.io/demo-id/",
    Transformations: []map[string]any{
        {
            "height": 300,
            "width":  400,
            "raw": "l-image,i-default-image.jpg,w-100,b-10_CDDC39,l-end"
        },
    },
}

Sample Result URL

https://ik.imagekit.io/demo-id/default-image.jpg?tr=h-300,w-400,l-image,i-default-image.jpg,w-100,b-10_CDDC39,l-end

Solid color blocks as overlays

You can add solid color blocks over a base video or image using an image layer (l-image).

For example:

params := ikurl.UrlParam{
    Path:        "img/sample-video.mp4",
    UrlEndpoint: "https://ik.imagekit.io/demo-id/",
    Transformations: []map[string]any{
        {
            "height": 300,
            "width":  400,
            "raw": "l-image,i-ik_canvas,bg-FF0000,w-300,h-100,l-end"
        },
    },
}

Sample Result URL

https://ik.imagekit.io/demo-id/img/sample-video.mp4?tr=h-300,w-400,l-image,i-ik_canvas,bg-FF0000,w-300,h-100,l-end

List of supported transformations

See the complete list of transformations supported in ImageKit here. The SDK gives a name to each transformation parameter e.g. height for h and width for w parameter. It makes your code more readable. If the property does not match any of the following supported options, it is added as it is.

If you want to generate transformations in your application and add them to the URL as it is, use the raw parameter.

Supported Transformation Name Translates to parameter
height h
width w
aspectRatio ar
quality q
crop c
cropMode cm
x x
y y
xc xc
yc yc
focus fo
format f
radius r
background bg
border b
rotation rt
blur bl
named n
progressive pr
lossless lo
trim t
metadata md
colorProfile cp
defaultImage di
dpr dpr
effectSharpen e-sharpen
effectUSM e-usm
effectContrast e-contrast
effectGray e-grayscale
original orig
raw replaced by the parameter value

File-Upload

The SDK uploader package provides a simple interface using the .upload() method to upload files to the ImageKit Media Library. It accepts all the parameters supported by the ImageKit Upload API.

The upload() method accept file and UploadParam. File param can be base64 encoded image, absolute HTTP URL, or io.Reader. This method returns the UploadResponse object and err if any. In addition, you can pass other parameters supported by the ImageKit upload API using the same parameter name as specified in the upload API documentation. For example, to set tags for a file at the upload time, use the tags parameter as defined in the documentation here.

import "github.com/imagekit-developer/imagekit-go/uploader"

const base64Image = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
resp, err := ik.Uploader.Upload(ctx, base64Image, uploader.UploadParam{
    FileName: "myimage.jpg"
})

File-Management

The SDK provides a simple interface for all the media APIs mentioned here to manage your files.

1. List & Search Files

List files in the media library, optionally filter and sort using FileParams.

import (
    "github.com/imagekit-developer/imagekit-go"
    "github.com/imagekit-developer/imagekit-go/api/media"
)

resp, err := ik.Media.Files(ctx, media.FilesParam{
    Skip: 10,
    Limit: 500,
    SearchQuery: "createdAt >= \"7d\" AND size > \"2mb\"",
})

2. Get File Details

Accepts the file ID and fetches the details as per the API documentation here.

resp, err := ik.Media.FileById(ctx, "file_id")

3. Get File Version Details

Get all the details and attributes of any version of a file as per the API documentation here.

resp, err := ik.Media.FileVersions(ctx, media.FileVersionsParam{
    FileId: "file_id",
    VersionId: "version_id",
})

4. Get File Versions

Get all the file version details and attributes of a file as per the API documentation here.

resp, err := ik.Media.FileVersions(ctx, media.FileVersionsParam{
    FileId: "file_id",
})

5. Update File Details

Update parameters associated with the file as per the API documentation here.

resp, err := ik.Media.UpdateFile(ctx, fileId, media.UpdateFileParam{
    Tags: []string{"tag_1", "tag_2"},
    RemoveAITags: []string{"car", "suv"},
})

6. Add Tags (bulk)

Set tags to multiple files. Accepts slices of tags and file Ids. Returns slice of file ids. API documentation here.

resp, err := ik.Media.AddTags(ctx, media.TagsParam{
    FileIds: []string{"file_id_1", "file_id_2"},
    Tags: []string{"tag_1", "tag_2"},
})

7. Remove Tags (bulk)

Removes tags from multiple files. Returns slice of file IDs updated. API documentation here.

resp, err := ik.Media.RemoveTags(ctx, media.TagsParam{
    FileIds: []string{"file_id_1", "file_id_2"},
    Tags: []string{"tag_1", "tag_2"},
})

8. Remove AITags (bulk)

Remove AITags in bulk API. Returns slice of file ids. API documentation here.

resp, err := ik.Media.RemoveAITags(ctx, media.AITagsParam{
    FileIds: []string{"file_id_1", "file_id_2"},
    AITags: []string{"tag_1", "tag_2"},
})

9. Delete File

Delete a file by fileId. API documentation here.

resp, err := ik.Media.DeleteFile(ctx, "file_id")

10. Delete File Version

Deletes the given version of the file. API documentation here.

resp, err := ik.Media.DeleteFileVersion(ctx, "file_id", "version_1")

11. Delete Files (bulk)

Deletes multiple files. API documentation here.

resp, err := ik.Media.DeleteBulkFiles(ctx, media.FileIdsParam{
    FileIds: []string{"file_id1", "file_id2"},
)

12. Copy File

This will copy a file from one location to another as per API documentation here.

Accepts the source file's path and destination folder path.

resp, err := ik.Media.CopyFile(ctx, media.CopyFileParam{
    SourcePath: "/source/a.jpg",
    DestinationPath: "/target/",
    IncludeFileVersions: false,
})

13. Move File

This will move a file from one location to another as per API documentation here.

Accepts the source file's path and destination folder path.

resp, err := ik.Media.MoveFile(ctx, media.MoveFileParam{
    SourcePath: "/source/a.jpg",
    DestinationPath: "/target/",
})

14. Rename File

Renames a file as per API documentation here. Accepts file path, new name and purge cache option.

resp, err := ik.Media.RenameFile(ctx, media.RenameFileParam{
    FilePath: "/path/to/file.jpg",
    NewFileName: "newname.jpg",
    PurgeCache: true,
})

15. Restore File Version

Restore the file version as per API documentation here. Accepts string type file id and version id.

resp, err := ik.Media.RestoreVersion(ctx, media.FileVersionsParam{
    FileId: "file_id",
    VersionId: "version_id",
})

16. Create Folder

Creates a new folder as per API documentation here. err is not nil when the response is not 201.

Accepts string type folder name and parent path.

resp, err := ik.Media.CreateFolder(ctx, media.CreateFolderParam{
   FolderName: "nature",
   ParentFolderPath: "/some/pics"
}

17. Delete Folder

Deletes the specified folder and all nested files, their versions & folders. This action cannot be undone. Accepts string type folder name to delete. API documentation here.

resp, err := ik.Media.DeleteFolder(ctx, media.DeleteFolderParam{
    FolderPath: "/some/pics/nature",
})

18. Copy Folder

Copies given folder to new location with or without versions info as per API documentation here.

resp, err := ik.Media.CopyFolder(ctx, media.CopyFolderParam{
    SourceFolderPath: "source/path",
    DestinationPath: "destination/",
    IncludeFileVersions: false
})

19. Move Folder

Moves given folder path to new location as per API documentation here.

resp, err := ik.Media.MoveFolder(ctx, media.MoveFolderParam{
    SourceFolderPath: "source/path",
    DestinationPath: "destination/path",
})

20. Bulk Job Status

Get the status of a bulk job operation by job id. Accepts string type job id. API documentation here.

resp, err := ik.BulkJobStatus(ctx, "job_id")

21. Purge Cache

This will purge the CDN and ImageKit internal cache for a given URL. API documentation here.

resp, err := ik.Media.PurgeCache(ctx, media.PurgeCacheParam{
    Url: "https://ik.imageki.io/your_imagekit_id/rest-of-the-file-path.jpg"
})

22. Purge Cache Status

Get the status of the submitted purge request. Accepts purge request id. API documentation here.

resp, err := ik.Media.PurgeCacheStatus(ctx, "request_id")

Metadata API

1. Get File Metadata for uploaded media files

Accepts the file ID or URL and fetches the metadata as per the API documentation here.

resp, err := ik.Metadata.FromFile(ctx, "file_id")

2. Get File Metadata from remote url

Get image EXIF, pHash, and other metadata from ImageKit.io powered remote URL using this API as per the API documentation here.

resp, err := ik.Metadata.FromUrl(ctx, "http://domian/a.jpg")

Custom Metadata fields API

Create, Update, Read and Delete custom metadata rules as per the API documentation here.

1. Create custom metadata field

import "github.com/imagekit-developer/imagekit-go/api/media/metadata"

resp, err := ik.Metadata.CreateCustomField(ctx, metadata.CreateFieldParam{
    Name: "weight",
    Label: "Weight",
    Schema: metadata.Schema{
        Type: "Number",
        MinValue: 1,
        MaxValue: 1000,
    }
})

2. List custom metadata fields

Accepts context and boolean flag(true|false) to get deleted fields.

resp, err := ik.Metadata.CustomFields(ctx, true)

3. Update custom metadata field

resp, err := ik.Metadata.UpdateCustomField(ctx, "field_id", UpdateCustomFieldParam{
    Label: "Cost",
})

4. Delete custom metadata field

Accepts context and fieldId to delete the custom metadata field.

resp, err := ik.Metadata.DeleteCustomField(ctx, "field_id")

Utility Functions

We have included the following commonly used utility function in this package.

1. Authentication parameter generation

This method generates a signature for a given token and timestamp using the configured private key. It is useful for client-side file upload to authenticate requests. Token is a random string. Expires is a unix timestamp by which token should expire. Token and Expires are both optional parameters. Token defaults to an auto-generated UUID string. Expires defaults to a current time + 30 minutes value.

// Using auto-generated token and expiration
resp := ik.SignToken(imagekit.SignTokenParam{})

// Using specific token and expiration
resp := ik.SignToken(imagekit.SignTokenParam{
    Token: "token-string",
    Expires: 1655379249,
})

Rate Limits

Except for upload API, all ImageKit APIs are rate limited to avoid excessive request rates.

Whenever backend API returns 429 status code, error of type ErrTooManyRequests is returned, which can be tested with errors.Is. The rate limit detail can be retrieved from the response metadata header. Please sleep/pause for the number of milliseconds specified by the value of resp.ResponseMetaData.Header["X-RateLimit-Reset"] property before making additional requests to that endpoint.

import (
    "errors"

    "github.com/imagekit-developer/imagekit-go"
    "github.com/imagekit-developer/imagekit-go/metadata"
    "github.com/imagekit-developer/imagekit-go/api"
)
ik, err := ImageKit.New()

resp, err := ik.Metadata.CustomFields(ctx, true)
if errors.Is(err, api.ErrTooManyRequests) {
    log.Println("rate limit exceeded", resp.ResponseMetaData.Header["X-RateLimit-Limit"])
}

Support

For any feedback or to report any issues or general implementation support, please reach out to [email protected]

Links

License

Released under the MIT license.