7

Я пытаюсь загрузить простой массив байтов в хранилище Firebase, но мой onFailureListener продолжает получать звонки и протоколироваться ко мне, говоря, что загрузка не удалась. Я надеюсь, что вы, ребята, можете сказать мне, что случилось с моим кодом.Как загрузить изображение в хранилище Firebase?

На вершине я получил

//Firebase 
    private Firebase mRef; 
    private StorageReference storageRef; 

Тогда в 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"); 

} 

Тогда в моем 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(); 
       } 
      } 
     } 

Вот моя трассировка стеки:

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

В 'OnFailure()', 'добавить e.getMessage()' в сообщении журнала, чтобы увидеть причину исключения. –

+0

Вы предоставили разрешение для Интернета? –

+0

[documentation] (https://firebase.google.com/docs/storage/android/upload-files) объясняет, что для правил безопасности по умолчанию для Firebase Storage требуется аутентификация. Вы подписались на пользователя или изменили правила, чтобы разрешить публичный доступ? –

ответ

6

Вы либо должны войти в пользователя или изменить правила безопасности, чтобы обеспечить доступ общественности. Это объясняется в документации для Firebase Storage Security.

Для начальной разработки, вы можете изменить правила в том Firebase консоли для обеспечения доступа общественности:

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

Просто позвоните этому методу, чтобы сохранить свое изображение в 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); 
} 

Для получения более подробной информации см этих примеров:

+0

Вам не нужно загружать задание и StorageReference, чтобы поместить его в хранилище firebase? – TheQ

+0

Я хочу поместить изображение в хранилище, а не базу данных базы данных – TheQ

5

Я загрузка, используя следующий код может быть помочь вам.

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

     } 

Зависимость:

проекта Уровень Gradel: classpath 'com.google.gms:google-services:3.0.0'

App Уровень Gradel: compile 'com.google.firebase:firebase-storage:9.0.2'

+0

Знаете ли вы, что в приложении gradle нам нужно включить что-либо для хранения в firebase? – TheQ

+0

В градиенте уровня проекта мы требуем classpath 'com.google.gms: google-services: 3.0.0' и градиент уровня приложения, который нам требуется компилировать 'com.google.firebase: firebase-storage: 9.0.2' define –

+0

да я включил это и пробовал ваш код, все равно ничего хорошего: / – TheQ

0

Загрузить multilple изображения Firebase хранения.

Это работает для меня.

с помощью этой библиотеки

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

В верхней

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

OnCreate()

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

нажатие кнопки действия

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

      } 
     }); 

результат активности

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

      } 
     } 

    }