Search code examples
javascriptandroidparse-platformparse-serverparse-cloud-code

Saving jpg file with cloud-code Parse-Server


I'm trying to save jpg files with cloud code on parse server ...

On Android I can do it using this way

Bitmap bitmap = ((BitmapDrawable) myImageView.getDrawable()).getBitmap();

ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                    byte [] byteArrayPhotoUpdate = stream.toByteArray();
                    final ParseFile pictureFileParse = new ParseFile( newUserInfo.getObjectId() + ".JPEG",byteArrayPhotoUpdate);

     newUserInfo.put("profile_picture",pictureFileParse);
     newUserInfo.saveInBackground();

But I have no idea how to do this in the cloud code. I call my cloud code functions like this

HashMap<String, String> params = new HashMap();

ParseCloud.callFunctionInBackground("myCloudFuncion", params, new FunctionCallback<String>() {
         @Override
          public void done(String aFloat, ParseException e) {

                }
            }); 

but I have no idea how to pass a bitmap in hashmap params. I already searched the internet, but nothing that I found in helped, the links that refer to something useful, is already old and outdated, from the epoch of the old parse ...

In parse docs I found this

    var base64 = "V29ya2luZyBhdCBQYXJzZSBpcyBncmVhdCE=";
    var file = new Parse.File("myfile.txt", { base64: base64 });

Which made me confused because I do not know if the 2 "base64" parameters refer to variable or base64 type

Should I convert my bitmap to base64 and send it as parameter to the cloud code?

If you have been through this and know how, I will be very happy to know your solution. Thank you!


Solution

  • you need convert your image bitmap for base64 like that:

                Bitmap bitmap = ((BitmapDrawable) img.getDrawable()).getBitmap();
    
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                byte [] byteArrayPhotoUpdate = stream.toByteArray();
                String encodedfile = new String(Base64.encodeBase64(byteArrayPhotoUpdate), "UTF-8");
    

    And then, send your string base64 in params, like that:

     HashMap<String, String> params = new HashMap();
     params.put("fileInfo",encodedfile);
     ParseCloud.callFunctionInBackground("saveParseUserInfo", params, new FunctionCallback<String>() {
                        @Override
                        public void done(String aFloat, ParseException e) {
    
                         Log.i("ewaeaweaweaweawe", "done: " + aFloat);
                        }
                    });
    

    Now in your cloud code, use that:

    Parse.Cloud.define("saveParseUserInfo", function(request, response) {
                    var userId = request.user.id;
                    var base64 = request.params.fileInfo;
                    var userClass = Parse.Object.extend("User");
                    //create a user object to set ACL
                    var userObject = userClass.createWithoutData(userId);
    
                    //create new ParseObject
                    var userPublicClass = Parse.Object.extend("userPublic");
                    var userPublic = new userPublicClass();
                    var aclAction = new Parse.ACL(userObject);
                    aclAction.setPublicReadAccess(true);
                    userPublic.setACL(aclAction);
                    userPublic.set("name", "name random");
                    userPublic.set("username", "username_random");
                    //Now create a Parse File object
                    var file = new Parse.File("photo.jpeg", { base64: base64 });
                    //set file object in a colum profile_picture
                    userPublic.set("profile_picture",file);
                    //save
                    userPublic.save(null, { useMasterKey: true,  
                    success: function(actionSuccess) {  
    
                        response.success("saved!!");
                    },
                    error: function(action, error) {
                        // Execute any logic that should take place if the save fails.
                        // error is a Parse.Error with an error code and message.
                    response.error(error.message);
                }
                });
    
    
    
    
    
    
                });     
    

    I hope it's help you.