Reputation: 672
I am a new firebase developer. I am developing an android app that lets users upload images to firebase storage. Because I am using Spark mode I only have 5Gb of storage. I want to limit the size of images that users upload to firebase storage. Below is the code that I use to upload an image to firebase storage.
Uri imageUri = Uri.parse(imagePath);
//need permistion android.permission.MANAGE_DOCUMENTS to upload file.
final StorageReference photoRef = mStorageRef.child(Constants.FIREBASE_LOCATION_IMAGE_EXAM).child(imageUri.getLastPathSegment());
taskStarted();
photoRef.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Log.d(TAG, "upload success");
mUploadExamTaskCount--;
examURLArray.add(new ExamPage(taskSnapshot.getDownloadUrl().toString()));
if (mUploadExamTaskCount == 0) {//upload files success.
/**
* update image link to database.
*/
DatabaseReference firebaseExamPage = FirebaseDatabase.getInstance().getReference(Constants.FIREBASE_LOCATION_EXAM_PAGE);
firebaseExamPage.child(examKey).setValue(examURLArray);
Log.d(TAG, "send upload exam success br");
Intent taskCompletedIntent = new Intent(ACTION_UPLOAD_EXAM_COMPLETED);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(taskCompletedIntent);
}
taskCompleted();
}
})
Do you have any idea how to resolve this problem ?
Upvotes: 16
Views: 16274
Reputation: 3360
If you goal is not necessarily to limit the user, but to keep the images in a low size, you could better resize the image on client side using JavaScript.
That was the perfect solution for us, saving:
If you are interested, you could follow this other answer from dcollien, in which we based the resizing:
https://stackoverflow.com/a/31669706/1920145
As one can see in that answer, the usage method is really simple, and the script to include is only one small JS / ES6 file.
I believe this guy (dcollien) deserves much more merit, so I suggest you to vote his answer and this answer up (so others can find it as relevant).
The author of the previous recomended script is now recommending this other script: https://github.com/nodeca/pica
It can be tested here: http://nodeca.github.io/pica/demo/
Note: I haven't tested it in my codes yet, but should be better (the other one had a glitch).
Upvotes: 8
Reputation: 31
Might be late but can help another newbie :-) You can reduce the size of the upload using bytes this way:
StorageReference fileToUpload = mStorage.child("xyz").child(x);
ByteArrayOutputStream bao = new ByteArrayOutputStream();
photo.invalidate();
BitmapDrawable drawable = (BitmapDrawable) photo.getDrawable();
Bitmap imp = drawable.getBitmap();
imp.compress(Bitmap.CompressFormat.JPEG, 25, bao);
byte[] byteArray = bao.toByteArray();
UploadTask uploadTask = fileToUpload.putBytes(byteArray);
Upvotes: 0
Reputation: 15953
Per the Firebase Storage Security Rules docs, you can write rules that check the size of an uploaded file:
service firebase.storage {
match /b/<bucket>/o {
match /files/{fileName} {
allow read;
allow write: if request.resource.size < 10 * 1024 * 1024; // 10MB limit for instance
}
}
}
Upvotes: 38