Сохранение файла jpg с облачным кодом Parse-Server
Я пытаюсь сохранить файлы jpg с облачным кодом на сервере разбора...
На Android я могу сделать это таким образом
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();
Но я понятия не имею, как это сделать в облачном коде. Я называю свои функции облачного кода такими
HashMap<String, String> params = new HashMap();
ParseCloud.callFunctionInBackground("myCloudFuncion", params, new FunctionCallback<String>() {
@Override
public void done(String aFloat, ParseException e) {
}
});
но я понятия не имею, как передать растровое изображение в параметрах hashmap. Я уже искал в Интернете, но ничего, что я нашел, не помогло, ссылки, которые ссылаются на что-то полезное, уже старые и устаревшие, с эпохи старого разбора...
В разборе документов я нашел это
var base64 = "V29ya2luZyBhdCBQYXJzZSBpcyBncmVhdCE=";
var file = new Parse.File("myfile.txt", { base64: base64 });
Что меня смутило, потому что я не знаю, относятся ли 2 параметра "base64" к типу переменной или base64
Должен ли я преобразовать свое растровое изображение в base64 и отправить его в качестве параметра в облачный код?
Если вы прошли через это и знаете, как, я буду очень рад узнать ваше решение. Спасибо!
1 ответ
Вам нужно конвертировать растровое изображение для base64 следующим образом:
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");
А затем отправьте вашу строку base64 в параметрах, например:
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);
}
});
Теперь в вашем облачном коде используйте это:
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);
}
});
});
Я надеюсь, что это поможет вам.
Этот ответ работает, если вы не хотите использовать Base64, для которого требуется API 26 и выше для Android.
Я знаю, что Жоао Армандо ответил на этот вопрос, но это для тех, кто, как и я, поддерживает версии до API 26 для Android.
PS Base64.encodeBase64(...) устарел, и теперь используется Base64.getEncoder()..., для чего требуется API 26.
Решение состоит из трех основных частей:
- Преобразуйте растровое изображение в byteArray
- Отправьте этот byteArray напрямую как параметры при вызове облачной функции
- Отформатируйте этот byteArray в самом облачном коде
В Android:
Преобразовать растровое изображение в байт []
Bitmap bitmap = <Your source>;
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Отправить как параметры при вызове облачной функции
HashMap<String, Object> params = new HashMap<>();
params.put("imageInByteArray", byteArray);
ParseCloud.callFunctionInBackground("yourCloudFunction", params, new FunctionCallback<Map>() {
@Override
public void done(Map object, ParseException e) {
if(e == null){
// Success
} else {
// Failed
}
}
});
В облачной функции / коде
Коды могут отличаться в зависимости от используемой версии javascript. Я использую серверную часть как услугу, которая улучшилась по сравнению с кодами, связанными с обещаниями. В любом случае логика должна быть применима.
Parse.Cloud.define("reportId", async request => {
// Retrieve and set values from client app
const imageInByteArray = request.params.imageInByteArray;
// Format as ParseFile
var file = new Parse.File("image.png", imageInByteArray);
// Initialize your class, etc.
....
// Save your object
await yourImageObject.save(null, {useMasterKey:true});
});