Не могу получить URL загруженного файла - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь получить URL загруженного файла, но я получаю это: com.google.android.gms.tasks.zzu@a12a0cb или что-то подобное.

Вот код, который я пробовал (kotlin):

val uid = UUID.randomUUID().toString()

val storageRef = FirebaseStorage.getInstance().reference.child("content/$uid/$uid.jpg")

storageRef.putFile(file).addOnSuccessListener { taskSnapShot ->
    val downloadUrl = storageRef.downloadUrl
    FirebaseDatabase.getInstance().reference.child("Photos").child(date).push().setValue(downloadUrl)
}

Но это не работает. Также я попробовал следующий код:

val uid = UUID.randomUUID().toString()

val storageRef = FirebaseStorage.getInstance().reference.child("content/$uid/$uid.jpg")

storageRef.putFile(file).addOnSuccessListener (
      object : OnSuccessListener<UploadTask.TaskSnapshot> {
          override fun onSuccess(taskSnapshot: UploadTask.TaskSnapshot?) {
              val downloadUrl = storageRef.downloadUrl
              FirebaseDatabase.getInstance().reference.child("Photos").child(date).push().setValue(downloadUrl)
          }
      }
)

Но результат тот же. Я все еще вставляю com.google.android.gms.tasks.zzu@a12a0cb в свою базу данных вместо URL. Что я делаю не так? Я потратил весь свой день, пытаясь понять это, пожалуйста, помогите.

Ответы [ 5 ]

0 голосов
/ 06 августа 2019

Если вы работаете с kotlin, этот код основан на официальной документации и работает как брелок.

    fun fileUpload() {


    mFireBaseStorage = FirebaseStorage.getInstance()
    mphotoStorageReference = mFireBaseStorage.getReference().child("alvaras")

    //in case you want to compress your bitmap before upload
    val bmp: Bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath) //filepath is the URI from the onActivityResult
    val baos: ByteArrayOutputStream = ByteArrayOutputStream()
    bmp.compress(Bitmap.CompressFormat.JPEG, 25, baos) //25 is the compression, cane be anything between 1 and 100, but 100 is no compression

    //get the uri from the bitmap
    val tempUri: Uri = getImageUri(this, bmp)
    //transform the new compressed bmp in filepath uri
    filePath = tempUri //update the filePath variable

var uploadTask = mphotoStorageReference.putFile(filePath)

    val urlTask = uploadTask.continueWithTask(Continuation<UploadTask.TaskSnapshot, Task<Uri>> { task ->
        if (!task.isSuccessful) {
            task.exception?.let {
                throw it
            }
        }
        return@Continuation mphotoStorageReference.downloadUrl
    }).addOnCompleteListener { task ->
        if (task.isSuccessful) {
            val downloadUri = task.result

            urifinal = downloadUri.toString() //this is the url you want
            val imageView: ImageView = findViewById(R.id.imageView1)

            //show it in a imageview with glide with the url
            Glide.with(this@MapsActivity).load(urifinal).into(imageView)
            imageView.visibility = View.VISIBLE

        } else {
            // Handle failures
        Toast.makeText(this, "An error occur", Toast.LENGTH_SHORT).show()
            // ...
        }
    }


    }
0 голосов
/ 11 июля 2018

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

final StorageReference filepath = mImageStorage.child("profile_images").child(current_user_id + ".jpg");


            filepath.putFile(resultUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onComplete(@NonNull final Task<UploadTask.TaskSnapshot> task) {

                    filepath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {

                            if (task.isSuccessful()){

                                String download_url=uri.toString();//Here is the URL

                                mUserDatabase.child("image").setValue(download_url)/*Storing the URL in the Firebase database*/
                                 .addOnCompleteListener(new OnCompleteListener<Void>() {

                                    @Override
                                    public void onComplete(@NonNull Task<Void> task) {

                                        if (task.isSuccessful()) {

                                            /*mProgressDialog.dismiss();
                                            Toast.makeText(SettingsActivity.this, "Success Uploading", Toast.LENGTH_LONG).show();*/

                                        }
                                    }
                                });

                            }else {
                                /*Toast.makeText(SettingsActivity.this, "Error in uploading!", Toast.LENGTH_LONG).show();
                                mProgressDialog.dismiss();*/
                            }

                        }
                    });

                }
            });
0 голосов
/ 28 июня 2018

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

//Data is the uri of the file
  UploadTask uploadTask =mProfileStorageRef.child("profilePic").putFile(data);
 uploadTask.addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onComplete(@NonNull final Task<UploadTask.TaskSnapshot> task) {

            task.getResult().getStorage().getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {

                    if (task.isSuccessful()) {

                        //Url is here
                        String url = uri.toString();



                            }
                        });
0 голосов
/ 30 июня 2018

У меня была такая же проблема. Я просто решил это. Я не могу точно сказать, почему он не работал с другими синтаксисами, но я получил результат, сделав это следующим образом: (версия реализации Firebase: 16.0.1 / Kotlin)

mReference.putFile (uri) .addOnFailureListener {
          // failure
       } .addOnSuccessListener () {taskSnapshot -> 
         // success
             mReference.downloadUrl.addOnCompleteListener () {taskSnapshot ->

                 var url = taskSnapshot.result
                 println ("url =" + url.toString ())

             }
  }
0 голосов
/ 28 июня 2018

Возможно, вы используете старую версию Firebase-хранилища. Способ, которым вы хотите получить URL, устарел, посмотрите журнал изменений Облачное хранилище версии 16.0.1

У меня нет кода Kotlin, но код Java

final StorageReference ref = storageRef.child("images/mountains.jpg");
uploadTask = ref.putFile(file);

Task<Uri> urlTask = 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();
        }

        // Continue with the task to get the download URL
        return ref.getDownloadUrl();
    }
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
    @Override
    public void onComplete(@NonNull Task<Uri> task) {
        if (task.isSuccessful()) {
            Uri downloadUri = task.getResult();
        } else {
            // Handle failures
            // ...
        }
    }
});

Этот код вы можете найти в документации Android по Firebase Storage в разделе Android> Загрузить файлы> Получить URL для загрузки

...