Search code examples
amazon-web-servicesimageamazon-s3uploadcodenameone

Codename one upload image to S3 bucket


I am trying to upload an image to my s3 bucket in my codenameone project as per the thread below,

Codename one upload image to S3 bucket permission

But unable to do so. Getting connection error code 301 and java.lang.NullPointerException ...

To make sure my s3 bucket configurations are correct, I have successfully uploaded an image using Postman app and Javascript sdk.

I would like to understand does the above example require any additional credentials info like AccessKey, SecretKey and AWS Region? If so please guide on the same.

Your help is much appreciated.

Thanks

Below is my code.

try {

        String strImage = Capture.capturePhoto(300, -1);             
        String s3Bucket = "https://s3.amazonaws.com/mybucketname/";
        String fileName = "testimg1.jpg";
        
        MultipartRequest request = new MultipartRequest();
        request.setUrl(s3Bucket);            
        request.addRequestHeader("Content-Type", "image/jpeg");
        request.addArgumentNoEncoding("key", fileName);            
        request.addArgument("acl", "bucket-owner-full-control");
        request.addData("file", strImage, "image/jpeg");            
        NetworkManager.getInstance().addToQueueAndWait(request);
                 
        int http_code = request.getResponseCode();
        
        Dialog.show("Ok", String.valueOf( http_code) , "Ok", null);      
        
    } catch (Exception ex) {
        
        String err = ex.toString();
        Dialog.show("Err", err, "Ok", null);
    }

Netbeans console is showing below error.

java.lang.NullPointerException at com.codename1.io.ConnectionRequest.performOperationComplete(ConnectionRequest.java:935) at com.codename1.io.NetworkManager$NetworkThread.runCurrentRequest(NetworkManager.java:314) at com.codename1.io.NetworkManager$NetworkThread.run(NetworkManager.java:390) at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176) [Network Thread] 0:0:6,656 - Exception: java.io.IOException - Stream closed java.io.IOException: Stream closed at com.codename1.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:140) at com.codename1.io.BufferedInputStream.read1(BufferedInputStream.java:338) at com.codename1.io.BufferedInputStream.read(BufferedInputStream.java:445) at com.codename1.io.BufferedInputStream.read(BufferedInputStream.java:668) at com.codename1.io.Util.copyNoClose(Util.java:149) at com.codename1.io.Util.copyNoClose(Util.java:135) at com.codename1.io.Util.copy(Util.java:170) at com.codename1.io.Util.copy(Util.java:124) at com.codename1.io.Util.readInputStream(Util.java:303) at com.codename1.io.ConnectionRequest.readResponse(ConnectionRequest.java:1543) at com.codename1.io.ConnectionRequest.performOperationComplete(ConnectionRequest.java:1003) at com.codename1.io.NetworkManager$NetworkThread.runCurrentRequest(NetworkManager.java:314) at com.codename1.io.NetworkManager$NetworkThread.run(NetworkManager.java:390) at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)


Solution

  • As per Shai's suggestion I have made my bucket publicly accessible then the above code started working from codename one.

    Made 2 changes in the code,

    The url is now "https://mybucketname.s3.amazonaws.com/";

    And used "PUT" method of request object.

    Thank you Shai for all the help.