7

J'essaie de charger un tableau d'octets simple dans le stockage Firebase, mais mon onFailureListener continue de recevoir l'appel et de me rappeler que le téléchargement a échoué. J'espère que vous pourrez me dire ce qui ne va pas avec mon code.Comment télécharger une image dans le stockage Firebase?

Au sommet, j'obtenu

//Firebase 
    private Firebase mRef; 
    private StorageReference storageRef; 

Puis, en 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"); 

} 

Puis dans mon 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(); 
       } 
      } 
     } 

Voici ma trace de la pile:

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 :(
+0

Dans 'onFailure()', 'ajouter e.getMessage()' au message du journal pour voir la raison de l'exception. –

+0

Avez-vous donné l'autorisation INTERNET? –

+0

La [documentation] (https://firebase.google.com/docs/storage/android/upload-files) explique que les règles de sécurité par défaut de Firebase Storage nécessitent une authentification. Avez-vous connecté l'utilisateur ou modifié les règles pour autoriser l'accès public? –

Répondre

6

Soit vous devez vous connecter à l'utilisateur ou modifier les règles de sécurité pour permettre l'accès du public. Ceci est expliqué dans la documentation pour Firebase Storage Security.

Pour le développement initial, vous pouvez modifier les règles à la console Firebase pour permettre l'accès du public:

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; 
    } 
    } 
} 
2

Appelez simplement cette méthode pour stocker votre image dans 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); 

    // 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); 
} 

Pour plus de détails voir ces exemples:

+0

dont vous n'avez pas besoin de télécharger la tâche et StorageReference pour la mettre dans le stockage firebase? – TheQ

+0

je veux mettre l'image dans le stockage base de données non firebase – TheQ

5

Je télécharger en utilisant le code suivant peut être vous aider.

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); 
       } 
      }); 

     } 

Dépendance:

Niveau projet Gradel: classpath 'com.google.gms:google-services:3.0.0'

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

+0

savez-vous si, dans l'application gradle nous devons inclure quelque chose pour le stockage firebase? – TheQ

+0

Au niveau du projet gradel nous avons besoin de classpath 'com.google.gms: google-services: 3.0.0' et gradel niveau de l'application, nous avons besoin de compiler 'com.google.firebase: firebase-stockage: 9.0.2' définir –

+0

ouais je l'ai inclus et essayé votre code, toujours pas bon: / – TheQ

0

Télécharger des images multilple au stockage Firebase.

Cela fonctionne pour moi.

utilisant cette bibliothèque

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

Au sommet

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

onCreate()

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

cliquage l'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); 

      } 
     }); 

résultat de l'activité

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) + "%..."); 
         } 
        }); 

      } 
     } 

    }