15

I'm trying to upload a simple byte array into Firebase storage, but my onFailureListener keeps getting called and logging back to me saying that the upload failed. I'm hoping you guys can tell me whats wrong with my code.

At the top I got

 //Firebase private Firebase mRef; private StorageReference storageRef; 

Then in onStart()

@Override protected void onStart() { super.onStart(); googleApiClient.connect(); //Firebase mRef = new Firebase("link to firebase account"); FirebaseStorage storage = FirebaseStorage.getInstance(); storageRef = storage.getReferenceFromUrl("link to storage"); } 

Then in my onActivityResult()

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { addImageImageView.setVisibility(View.GONE); if (requestCode == Constants.REQUEST_CODE && resultCode == RESULT_OK && data != null) { //First we gotta make sure to add the images to ArrayList<Image> imagesFromGallery = data.getParcelableArrayListExtra(Constants.INTENT_EXTRA_IMAGES); for (int i = 0; i < imagesFromGallery.size(); i++) { try { //try uploading it InputStream stream = new FileInputStream(new File(imagesFromGallery.get(i).path)); StorageReference imageStorage = storageRef.child("cardImages/" + "testImages"); UploadTask uploadTask = imageStorage.putStream(stream); uploadTask.addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.d("myStorage","failure :("); } }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { Log.d("myStorage","success!"); } }); catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } } } 

Here is my stack trace:

11-13 21:27:00.392 31388-996/com.daprlabs.aaron.swipedeck2 E/StorageException: StorageException has occurred. User does not have permission to access this object. Code: -13021 HttpResult: 403 11-13 21:27:00.392 31388-996/com.daprlabs.aaron.swipedeck2 E/StorageException: The server has terminated the upload session java.io.IOException: The server has terminated the upload session at com.google.firebase.storage.UploadTask.az(Unknown Source) at com.google.firebase.storage.UploadTask.ay(Unknown Source) at com.google.firebase.storage.UploadTask.run(Unknown Source) at com.google.firebase.storage.StorageTask$5.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) 11-13 21:27:00.406 31388-31388/com.daprlabs.aaron.swipedeck2 D/myStorage: failure :( 
4
  • In onFailure(), add e.getMessage() to the log message to see the reason for the exception. Commented Nov 14, 2016 at 5:22
  • Have you given the INTERNET Permission? Commented Nov 14, 2016 at 5:25
  • The documentation explains that the default security rules for Firebase Storage require authentication. Have you signed-in the user or changed the rules to allow public access? Commented Nov 14, 2016 at 5:29
  • i just updated my stack trace Commented Nov 14, 2016 at 5:31

5 Answers 5

13

You either need to sign-in the user or change the security rules to allow public access. This is explained in the documentation for Firebase Storage Security.

For initial development, you can change the rules at the Firebase Console to allow public access:

service firebase.storage { match /b/project-XXXXXXXXXXXXXX.appspot.com/o { match /{allPaths=**} { // Provide access to all users allow read: if true; allow write: if true; } } } 
Sign up to request clarification or add additional context in comments.

2 Comments

You wrote : "... match /b/project-XXXXXXXXXXXXXX.appspot.com/o {...". Must I put in the project package name or project's so called Public-facing name. Mine is project-xxxxxxxx?
@CodeToLife: It looks like things have changed since I wrote this answer. Originally, the Project ID (shown on General tab of Project Settings) was used. Now it looks like you can use {bucket}. See the sample rules for an example.
5

I upload images using this code :

private void uploadFile(Bitmap bitmap) { FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageRef = storage.getReferenceFromUrl("Your url for storage"); StorageReference mountainImagesRef = storageRef.child("images/" + chat_id + Utils.getCurrentTimeStamp() + ".jpg"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 20, baos); byte[] data = baos.toByteArray(); UploadTask uploadTask = mountainImagesRef.putBytes(data); uploadTask.addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Handle unsuccessful uploads } }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL. Uri downloadUrl = taskSnapshot.getDownloadUrl(); sendMsg("" + downloadUrl, 2); Log.d("downloadUrl-->", "" + downloadUrl); } }); } 

Dependency :

Project Level Gradel : classpath 'com.google.gms:google-services:3.0.0'

App Level Gradel : compile 'com.google.firebase:firebase-storage:9.0.2'

2 Comments

do you know if, in app gradle we need to include anything for firebase storage?
In project level gradel we have require to classpath 'com.google.gms:google-services:3.0.0' and app level gradel we have require compile 'com.google.firebase:firebase-storage:9.0.2' define
3

Simply call this method to store your image to firebase.

 private void storeImageToFirebase() { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 8; // shrink it down otherwise we will use stupid amounts of memory Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoUri.getPath(), options); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] bytes = baos.toByteArray(); String base64Image = Base64.encodeToString(bytes, Base64.DEFAULT); //For the API less than 28 (Android version 8 ) //String base64Image = android.util.Base64.encodeToString(bytes, android.util.Base64.DEFAULT); // we finally have our base64 string version of the image, save it. firebase.child("pic").setValue(base64Image); System.out.println("Stored image with length: " + bytes.length); } 

For more details see these examples:

3 Comments

dont you need Upload task and StorageReference to put it in firebase storage?
i want to put the image in storage not firebase database
Your first link is now no longer available.
2

this method worked for me as if todate:

private void uploadImage(Bitmap bitmap) { progressDialog.show(); final StorageReference ref = storageReference.child("drivers/" + UserDto.getId() + ".jpg"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 20, baos); byte[] data = baos.toByteArray(); final UploadTask uploadTask = ref.putBytes(data); uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { progressDialog.dismiss(); Toast.makeText(ProfileActivity.this, "Uploaded", Toast.LENGTH_SHORT).show(); uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() { @Override public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception { if (!task.isSuccessful()) { throw task.getException(); } return ref.getDownloadUrl(); } }).addOnCompleteListener(new OnCompleteListener<Uri>() { @Override public void onComplete(@NonNull Task<Uri> task) { if (task.isSuccessful()) { Uri downUri = task.getResult(); Log.d("Final URL", "onComplete: Url: " + downUri.toString()); } } }); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { progressDialog.dismiss(); Toast.makeText(ProfileActivity.this, "Failed " + e.getMessage(), Toast.LENGTH_SHORT).show(); } }); } 

Comments

1

Upload multilple images to Firebase storage.

It is working for me.

using this library

 compile 'com.github.darsh2:MultipleImageSelect:3474549' 

At the top

private StorageReference storageRef; private FirebaseApp app; private FirebaseStorage storage; 

onCreate()

app = FirebaseApp.getInstance(); storage =FirebaseStorage.getInstance(app); 

button click action

 Gallary.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(ChatActivity.this, AlbumSelectActivity.class); intent.putExtra(Constants.INTENT_EXTRA_LIMIT, 10); startActivityForResult(intent, Constants.REQUEST_CODE); } }); 

Activity result

public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == Constants.REQUEST_CODE && resultCode == RESULT_OK) { ArrayList<Image> images = data.getParcelableArrayListExtra(Constants.INTENT_EXTRA_IMAGES); Uri[] uri=new Uri[images.size()]; for (int i =0 ; i < images.size(); i++) { uri[i] = Uri.parse("file://"+images.get(i).path); StorageReference ref = storage.getReference("photos").child(uri[i].getLastPathSegment()); ref.putFile(uri[i]) .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { Uri downloadUrl = taskSnapshot.getDownloadUrl(); String content = downloadUrl.toString(); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { } }) .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() { @Override public void onProgress(UploadTask.TaskSnapshot taskSnapshot) { //displaying the upload progress double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount(); progressDialog.setMessage("Uploaded " + ((int) progress) + "%..."); } }); } } } 

2 Comments

Can you pls share github link of this ?
@Nizamudeen Sherif i will send to the source code. Please give your mail id

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.