如何在Firebase Storage中创建文件夹?

37
新版 Firebase 支持使用 Google Cloud Platform 进行存储。
您可以使用以下方法将文件上传到 "images" 文件夹中:
var uploadTask = storageRef.child('images').put(file, metadata);

如果你想使用代码动态创建一个子文件夹images/user1234,该怎么办?
官方示例没有展示如何实现这一点,官方指南参考文档也没有提供相关信息。
Firebase控制台是唯一可以手动创建文件夹的地方吗?
6个回答

54
Firebase Storage API会动态地创建中间产品的“文件夹”:如果您在 images/user1234/file.txt 创建一个文件,那么所有中间的“文件夹”,如“images”和“user1234”,都将被创建。因此,您的代码将变成:
var uploadTask = storageRef.child('images/user1234/file.txt').put(file, metadata);

请注意,在child()调用中,您需要包括文件名(例如foo.txt),因为引用应该包括完整路径和文件名,否则您的文件将被称为images


我们可以在存储控制台上传一个文件夹吗? - shibapoo
这个错误提示我 "_filePath.includes is not a function" ... 你有什么想法吗?我传递给 .child() 的路径看起来是正确的(为了确保,我将其打印到控制台上)。 - Andrew Torr

32
Firebase控制台允许您创建文件夹,因为这是将文件添加到特定文件夹的最简单方式。
但是,没有公共API可以创建文件夹。相反,文件夹会在您将文件添加到其中时自动创建。
Firebase存储基于Google Cloud Storage。请参阅GCS提供的有关文件夹幻觉的文档。

6

您肯定可以创建目录...只需稍微调整引用,我按照以下步骤操作。

test = (e,v) => {
    let fileName = "filename"
    let newDirectory = "someDir"
    let storage = firebase.storage().ref(`images/${newDirectory}/${fileName}`)

    let file = e.target.files[0]
    if(file !== undefined && file.type === "image/png" ) {
        storage.put(file)
            .then( d => console.log('you did it'))
            .catch( d => console.log("do something"))
    }
}

enter image description here


2
你知道答案其实是一样的,只是弗兰克、迈克和我表达方式不同而已... - JustDave
1
你的回答不使用.child(),而是将文件夹路径直接放在ref()中而非child()。在AngularFire中,这实际上以我所期望的方式工作。在Mike的示例中,我遇到了父文件夹错误的问题,可能与AngularFire语法有关的怪癖。选项总是好的。 - SeanMC

5
Firebase缺乏非常重要的功能,总是需要做一些技巧来模拟应该是标准的行为。
如果您从Firebase控制台手动创建文件夹,则即使没有更多文件,它也将保持不变。
如果您动态地创建文件夹并且所有文件在某个时候被删除,则该文件夹也将消失并被删除。
我使用Firebase Storage实现了一个文件管理器,因此当用户想要上传文件时,他可以通过此界面而不是Firebase控制台来完成。您希望为用户提供重新组织文件的选项,但是创建新文件夹这样常见的事情也不能没有技巧地完成,为什么?只是因为这是Firebase。
因此,为了模拟这种行为,我想到了以下方法:
  1. 使用新文件夹名称创建引用。
  2. 创建一个“ghost”文件的引用,作为文件夹引用的子级,并始终给它相同的固定名称,例如'.ghostfile'。
  3. 将文件上传到这个新创建的文件夹中。任何方法都可以,我只是使用uploadString
  4. 每次列出引用的文件时,排除以前命名的任何文件。因此,这个“ghost”文件不会显示在文件管理器中。

创建文件夹的示例:

async function createFolder (currentRef: StorageReference, folderName: string) {
        const newDir = ref(currentRef, name)
        const ghostFile = ref(newDir, '.ghostfile')
        await uploadString(ghostFile, '')
}

并且有一个列出文件的示例:

async function loadLists (ref: StorageReference) {
    const { prefixes, items } = await listAll(ref)
    return {
        directories: prefixes,
        files: items.filter(file => file.name !=== '.ghostfile')
    }
}

4
String myFolder = "MyImages";
StorageReference riversRef = storageReference.child(myFolder).child("images/pic.jpg");

0
Firebase控制台允许您创建文件夹。我认为没有其他方法可以创建文件夹。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接