From 58b054f836ee6d2be9f997808ab50bf6f5ce1903 Mon Sep 17 00:00:00 2001 From: IceMajor2 <127668492+IceMajor2@users.noreply.github.com> Date: Wed, 19 Jul 2023 16:23:57 +0200 Subject: [PATCH 1/5] Add Java's BufferedImage as field --- .../imagekit/sdk/models/results/Result.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java index 4c51941..92ad60f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java @@ -4,16 +4,26 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; - import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.ResponseMetaData; - +import io.imagekit.sdk.utils.Utils; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; public class Result extends BaseFile { + private BufferedImage image; private String help; @Deprecated private String raw; @@ -50,6 +60,14 @@ public Result(String fileId, String name, String url, String thumbnail, int heig this.updatedAt = updatedAt; } + public BufferedImage getImage() { + return this.image; + } + + public void setImage(BufferedImage image) { + this.image = image; + } + public String getHelp() { return help; } From 604f7f114cec0c8ad1e226e8f36a29a601b620c0 Mon Sep 17 00:00:00 2001 From: IceMajor2 <127668492+IceMajor2@users.noreply.github.com> Date: Wed, 19 Jul 2023 16:25:15 +0200 Subject: [PATCH 2/5] Determine if file request is a 'readable image' with help of Utils class --- .../sdk/models/FileCreateRequest.java | 12 ++++++++ .../java/io/imagekit/sdk/utils/Utils.java | 28 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java index 4b39425..1c46905 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java @@ -29,23 +29,27 @@ public class FileCreateRequest { public Boolean overwriteTags; public Boolean overwriteCustomMetadata; public JsonObject customMetadata; + public boolean isReadableImage; public FileCreateRequest(URL url, String fileName) { this.url = url; this.fileName = fileName; this.useUniqueFileName = true; + this.isReadableImage = Utils.isReadableImage(url); } public FileCreateRequest(String base64, String fileName) { this.base64 = base64; this.fileName = fileName; this.useUniqueFileName = true; + this.isReadableImage = Utils.isReadableImage(base64); } public FileCreateRequest(byte[] bytes, String fileName) { this.bytes = bytes; this.fileName = fileName; this.useUniqueFileName = true; + this.isReadableImage = Utils.isReadableImage(bytes); } public String getFileName() { @@ -160,6 +164,14 @@ public void setCustomMetadata(JsonObject customMetadata) { this.customMetadata = customMetadata; } + public boolean isReadableImage() { + return isReadableImage; + } + + public void setReadableImage(boolean readableImage) { + isReadableImage = readableImage; + } + @Override public String toString() { return "FileCreateRequest{" + "fileName='" + fileName + '\'' + ", useUniqueFileName=" + useUniqueFileName diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index 19fa01c..b693422 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -21,7 +21,10 @@ import okhttp3.Credentials; import okhttp3.Response; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; import java.io.*; +import java.net.URL; import java.util.ArrayList; import java.util.Base64; import java.util.HashMap; @@ -182,4 +185,29 @@ public static ResultException populateResult(Response response) throws IOExcepti return result; } + public static BufferedImage createImage(URL url) { + try { + return ImageIO.read(url); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static boolean isReadableImage(String base64) { + byte[] bytes = Base64.getDecoder().decode(base64); + return isReadableImage(bytes); + } + + public static boolean isReadableImage(byte[] bytes) { + InputStream inputStream = new ByteArrayInputStream(bytes); + try { + return ImageIO.read(inputStream) != null; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static boolean isReadableImage(URL url) { + return createImage(url) != null; + } } From 6ebe6c8ab6439940a53301ffde3720da97b9f8d6 Mon Sep 17 00:00:00 2001 From: IceMajor2 <127668492+IceMajor2@users.noreply.github.com> Date: Wed, 19 Jul 2023 16:26:22 +0200 Subject: [PATCH 3/5] Check if uploaded file is a 'readable image' and adjust Result --- imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java | 3 ++- .../src/main/java/io/imagekit/sdk/tasks/RestClient.java | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 2cd8fa7..ad69cae 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -16,6 +16,7 @@ import io.imagekit.sdk.tasks.RestClient; import io.imagekit.sdk.tasks.UrlGen; +import java.net.MalformedURLException; import java.util.List; import java.util.Map; @@ -88,7 +89,7 @@ public String getUrl(Map options) { * @return object of Result class */ public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerException, BadRequestException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException, MalformedURLException { return restClient.upload(fileCreateRequest); } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 5e6fbf3..301076e 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -39,6 +39,8 @@ import java.io.IOException; import java.lang.reflect.Field; +import java.net.MalformedURLException; +import java.net.URL; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -62,7 +64,7 @@ public RestClient(ImageKit imageKit) { } public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerException, BadRequestException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException, MalformedURLException { Result result = null; Map headers = Utils.getHeaders(imageKit); @@ -87,6 +89,9 @@ public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerE } catch (IOException e) { throw new UnknownException(e.getMessage(), e.getCause()); } + if(fileCreateRequest.isReadableImage()) { + result.setImage(Utils.createImage(new URL(result.getUrl()))); + } return result; } From 611cae62b872ea6bbfc54e42455128d464649405 Mon Sep 17 00:00:00 2001 From: IceMajor2 <127668492+IceMajor2@users.noreply.github.com> Date: Wed, 19 Jul 2023 16:27:17 +0200 Subject: [PATCH 4/5] Write tests which assert 'isReadableImage' of utility class works correctly --- .../java/io/imagekit/sdk/utils/UtilsTest.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/utils/UtilsTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/utils/UtilsTest.java index e68b206..7a747ee 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/utils/UtilsTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/utils/UtilsTest.java @@ -87,4 +87,26 @@ public void test_getSystemConfig_expectedSuccess() throws IOException { Configuration config=Utils.getSystemConfig(UtilsTest.class); assertNotNull(config); } + + @Test + public void validImageURL_isReadableImage_expectedTrue() { + URL imageURL = UtilsTest.class.getClassLoader().getResource("sample1.jpg"); + assertTrue(Utils.isReadableImage(imageURL)); + } + + @Test + public void validImageByteArray_isReadableImage_expectedTrue() { + URL imageURL = UtilsTest.class.getClassLoader().getResource("sample1.jpg"); + File file=new File(imageURL.getPath()); + byte[] bytes = Utils.fileToBytes(file); + assertTrue(Utils.isReadableImage(bytes)); + } + + @Test + public void validImageBase64_isReadableImage_expectedTrue() { + URL imageURL = UtilsTest.class.getClassLoader().getResource("sample1.jpg"); + File file=new File(imageURL.getPath()); + String base64 = Utils.fileToBase64(file); + assertTrue(Utils.isReadableImage(base64)); + } } \ No newline at end of file From 7a665c4a7a9c9fb5a53f4384190a4d90f7805296 Mon Sep 17 00:00:00 2001 From: IceMajor2 <127668492+IceMajor2@users.noreply.github.com> Date: Wed, 19 Jul 2023 16:46:51 +0200 Subject: [PATCH 5/5] Test 'isReadableImage' method when the provided file is NOT an image --- .../java/io/imagekit/sdk/utils/UtilsTest.java | 22 +++++++++++++++++++ .../src/test/resources/not_an_image.txt | 1 + 2 files changed, 23 insertions(+) create mode 100644 imagekit-sdk/src/test/resources/not_an_image.txt diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/utils/UtilsTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/utils/UtilsTest.java index 7a747ee..17e18fb 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/utils/UtilsTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/utils/UtilsTest.java @@ -94,6 +94,12 @@ public void validImageURL_isReadableImage_expectedTrue() { assertTrue(Utils.isReadableImage(imageURL)); } + @Test + public void nonImageURL_isReadableImage_expectedFalse() { + URL nonImageURL = UtilsTest.class.getClassLoader().getResource("not_an_image.txt"); + assertFalse(Utils.isReadableImage(nonImageURL)); + } + @Test public void validImageByteArray_isReadableImage_expectedTrue() { URL imageURL = UtilsTest.class.getClassLoader().getResource("sample1.jpg"); @@ -102,6 +108,14 @@ public void validImageByteArray_isReadableImage_expectedTrue() { assertTrue(Utils.isReadableImage(bytes)); } + @Test + public void nonImageByteArray_isReadableImage_expectedFalse() { + URL imageURL = UtilsTest.class.getClassLoader().getResource("not_an_image.txt"); + File file=new File(imageURL.getPath()); + byte[] bytes = Utils.fileToBytes(file); + assertFalse(Utils.isReadableImage(bytes)); + } + @Test public void validImageBase64_isReadableImage_expectedTrue() { URL imageURL = UtilsTest.class.getClassLoader().getResource("sample1.jpg"); @@ -109,4 +123,12 @@ public void validImageBase64_isReadableImage_expectedTrue() { String base64 = Utils.fileToBase64(file); assertTrue(Utils.isReadableImage(base64)); } + + @Test + public void nonImageBase64_isReadableImage_expectedFalse() { + URL imageURL = UtilsTest.class.getClassLoader().getResource("not_an_image.txt"); + File file=new File(imageURL.getPath()); + String base64 = Utils.fileToBase64(file); + assertFalse(Utils.isReadableImage(base64)); + } } \ No newline at end of file diff --git a/imagekit-sdk/src/test/resources/not_an_image.txt b/imagekit-sdk/src/test/resources/not_an_image.txt new file mode 100644 index 0000000..169629c --- /dev/null +++ b/imagekit-sdk/src/test/resources/not_an_image.txt @@ -0,0 +1 @@ +This file is not an image. \ No newline at end of file