【问题标题】:Creating nested folders in firebase storage在 Firebase 存储中创建嵌套文件夹
【发布时间】:2018-01-28 04:38:22
【问题描述】:

我的班级中有一个 FirebaseDatabase 引用和两个 FirebaseStorage 引用。 第一个 StorageReference 是 ProductImages,第二个引用是我将从 DatabaseReference 中获得的按键。 但问题是,当我在存储中上传图像时,不会创建第二个引用。所有图像都存储在 ProductImages 参考中。 我的代码有什么问题吗? 这是 Firebase 的限制吗? 或者有没有其他方法可以通过编程方式在 Firebase 存储中创建嵌套文件夹?

我已附上代码:

private DatabaseReference productRef;
private StorageReference productImagesRef, imageRef;

productRef =   FirebaseDatabase.getInstance.getReference().child("Products");
productImagesRef = FirebaseStorage.getInstance().getReference().child("ProductImages");

final String key = productRef.push().getKey();
imageRef = FirebaseStorage.getInstance().getReference().child("ProductImages").child(key);

imageRef.putFile(mainImageUri)
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    // Handle unsuccessful uploads
                    progressDialog.dismiss();
                    Toast.makeText(getActivity(), "Failed to upload!!! Try Again...", Toast.LENGTH_SHORT).show();
                    return;
                }
            })
            .addOnSuccessListener(getActivity(), new OnSuccessListener<UploadTask.TaskSnapshot>() {
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    // When the image has successfully uploaded, we get its download URL
                   mainImageUrl = taskSnapshot.getDownloadUrl();
                }
            });

    imageRef.putFile(sideImageOneUri)
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    // Handle unsuccessful uploads
                    progressDialog.dismiss();
                    Toast.makeText(getActivity(), "Failed to upload!!! Try Again...", Toast.LENGTH_SHORT).show();
                    return;
                }
            })
            .addOnSuccessListener( getActivity(), new OnSuccessListener<UploadTask.TaskSnapshot>() {
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    // When the image has successfully uploaded, we get its download URL
                    sideImageOneUrl = taskSnapshot.getDownloadUrl();
                }
            });

【问题讨论】:

  • 不知道是不是推送ID中的字符引起了问题。您可以尝试仅使用硬编码的名称吗?例如。 imageRef = FirebaseStorage.getInstance().getReference().child("ProductImages").child("Subfolder");
  • @Amrit,让我们知道您想要制作哪种类型的嵌套文件夹。
  • @FrankvanPuffelen 我试过你的方法,但结果是一样的。你的代码和我的代码也发生了同样的事情。存储中仅存储一个图像,而不是创建一个名为“SubFolder”的新文件夹,该图像被命名为“SubFolder.jpeg”
  • @niveshshastri 我想要一个名为“ProductImages”的文件夹。这个文件夹应该可以容纳许多子文件夹,例如product1,product2,......这些子文件夹应该能够存储图像文件。但我的代码的问题是没有创建子文件夹,所有图像都存储在“ProductImages”文件夹中。
  • @Amrit,你不能用你的代码创建嵌套文件夹,你必须为这个任务更新你的代码。

标签: android firebase firebase-storage


【解决方案1】:

好的,伙计们,我想我已经得到了一个可以接受的答案。我为要存储的不同图像创建了不同的参考。代码如下:

private DatabaseReference productRef;
private StorageReference productImagesRef, imageRef, mainImgRef, sideImgRef;

productRef =   FirebaseDatabase.getInstance.getReference().child("Products");
productImagesRef = FirebaseStorage.getInstance().getReference().child("ProductImages");

final String key = productRef.push().getKey();
imageRef = FirebaseStorage.getInstance().getReference().child("ProductImages").child(key);

mainImgRef = imageRef.child(mainImageUri.getLastPathSegment());
sideImgRef = imageRef.child(sideImageOneUri.getLastPathSegment());


mainImgRef.putFile(mainImageUri)
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                // Handle unsuccessful uploads
                progressDialog.dismiss();
                Toast.makeText(getActivity(), "Failed to upload!!! Try Again...", Toast.LENGTH_SHORT).show();
                return;
            }
        })
        .addOnSuccessListener(getActivity(), new OnSuccessListener<UploadTask.TaskSnapshot>() {
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                // When the image has successfully uploaded, we get its download URL
               mainImageUrl = taskSnapshot.getDownloadUrl();
            }
        });

sideImgRef.putFile(sideImageOneUri)
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                // Handle unsuccessful uploads
                progressDialog.dismiss();
                Toast.makeText(getActivity(), "Failed to upload!!! Try Again...", Toast.LENGTH_SHORT).show();
                return;
            }
        })
        .addOnSuccessListener( getActivity(), new OnSuccessListener<UploadTask.TaskSnapshot>() {
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                // When the image has successfully uploaded, we get its download URL
                sideImageOneUrl = taskSnapshot.getDownloadUrl();
            }
        });

【讨论】:

    【解决方案2】:

    试试这个:

    productImagesRef.child(key).putFile(mainImageUri).....
    productRef.child(key).putFile(sideImageOneUri)....
    

    希望这会有所帮助。

    【讨论】:

    • 我没有创建相同的存储引用。请仔细阅读问题。第一个参考是: FirebaseStorage.getInstance().getReference().child("ProductImages"); ......第二个参考是: FirebaseStorage.getInstance().getReference().child("ProductImages").child(key);.......他们是不同。
    • 对不起先生,请查看我的新建议。
    猜你喜欢
    • 1970-01-01
    • 2016-10-06
    • 2020-05-09
    • 2019-03-06
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多