【问题标题】:Why Couldn't I upload Image file using ImageButton in Android Studio?为什么我不能在 Android Studio 中使用 ImageButton 上传图像文件?
【发布时间】:2020-04-16 16:59:39
【问题描述】:

我正在尝试使用图像按钮上传图像。我没有收到任何错误或崩溃,但在上传我的图片后,我收到了一条警报:“失败!”,以及 e 的消息。

你能帮帮我吗?

 private void uploadImage() {
        final ProgressDialog pd = new ProgressDialog(getContext());
        pd.setMessage("Uploading");
        pd.show();

        if(imageUri != null) {
            final StorageReference fileReference = storageReference.child(System.currentTimeMillis() + "." + getFileExtension(imageUri));
            uploadTask = fileReference.getFile(imageUri);
            uploadTask.continueWith(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 fileReference.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {

                    if(task.isSuccessful()) {
                        Uri downloadUri = task.getResult();
                        String mUri = downloadUri.toString();
                        reference = FirebaseDatabase.getInstance().getReference().child("users").child(fuser.getUid());
                        HashMap<String, Object> map = new HashMap<>();
                        map.put("imageURL", mUri);
                        reference.updateChildren(map);
                        pd.dismiss();
                    } else {
                        Toast.makeText(getContext(), "Failed!", Toast.LENGTH_SHORT).show();
                        pd.dismiss();
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
                    pd.dismiss();
                }
            });
        } else {
            Toast.makeText(getContext(), "No Image Selected", Toast.LENGTH_SHORT).show();
        }
    }

【问题讨论】:

  • 你能显示堆栈跟踪吗?
  • 消息到底是什么?请具体说明您正在观察的内容。
  • @ViniciusAlmada 太长了
  • @DougStevenson 消息是:该位置不存在对象
  • 您没有在任何地方调用fileReference.put 方法,这意味着您没有上传任何数据。因此,当您调用 fileReference.getDownloadURL() 时,它会引发错误,因为该位置没有文件可以返回下载 URL。我建议阅读uploading files 上的文档。

标签: java android firebase firebase-storage


【解决方案1】:

您没有在任何地方调用fileReference.put 方法,这意味着您没有上传任何数据。

因此,当您调用 fileReference.getDownloadURL() 时,它会引发错误,因为该位置没有文件可以返回下载 URL。

我建议阅读uploading files 上的文档,并等待上传完成后再尝试获取下载 URL。

【讨论】:

    【解决方案2】:

    如果您的错误信息是:

    该位置不存在对象

    那么这意味着您尝试下载的对象根本不存在。这是您用于构建该位置的代码:

    final StorageReference fileReference = storageReference
        .child(System.currentTimeMillis() + "." + getFileExtension(imageUri));
    

    因此,您似乎正在尝试使用与当前时间匹配的名称来获取应该存在的文件。我怀疑这几乎永远不会奏效。由于我们看不到您的存储桶的内容,而且我们不知道您在此处传递的确切字符串,因此不知道如何解决此问题。您的代码应该只获取其名称存在于存储桶中的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 2011-07-09
      • 2015-01-01
      • 2020-06-28
      • 1970-01-01
      • 2022-12-03
      • 2016-06-09
      相关资源
      最近更新 更多