【问题标题】:Firebase upload/download pdf filesFirebase 上传/下载 pdf 文件
【发布时间】:2017-12-12 09:59:58
【问题描述】:

是否可以在 Firebase 存储中手动上传 PDF 文件(通过 Web 浏览器),然后通过 Android 应用程序下载它们?

另外,我是否必须对用户(移动应用)进行身份验证才能下载文件?

这个想法是有一个“管理员”来上传文件,所有其他拥有移动应用程序的用户不应该对 Firebase 有任何了解,他们的应用程序应该做的就是,如果有互联网连接,检查是否有要下载的新文件。

【问题讨论】:

    标签: android firebase firebase-storage


    【解决方案1】:

    是否可以在 Firebase 存储中手动上传 PDF 文件(通过 Web 浏览器),然后通过 Android 应用程序下载它们?

    是的,您可以使用 Firebase 控制台手动上传 PDF 文件。但是,要使用 android 应用程序访问该文件,您需要知道它的文件名和完整的参考。

    另外,我是否必须对用户(移动应用)进行身份验证才能下载文件?

    没有必要,但建议只允许经过身份验证的访问。您可以通过在 Firebase 存储仪表板中更改 Security Rules 来进行配置。 示例规则:

    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
            // CHOOSE EITHER ONE FROM THESE
            allow read, write: if request.auth != null; // requires authentication
            allow read, write: if true; // doesn't require authentication
        }
      }
    } 
    

    他们的应用程序应该做的就是,如果有互联网连接,检查是否有新文件要下载

    目前,Firebase 存储不提供 API 来获取存储在引用下的所有文件的列表。因此,您无法直接访问存储桶中的文件列表。

    您可以使用here 建议的这种方法来使用 Firebase 实时数据库来存储存储中存在的文件的元数据(下载 URL)。请注意,当您上传要列出的文件时,您必须在实时数据库中添加(删除)条目。

    上传文件到存储:

    Uri file = Uri.fromFile(new File("path/to/your_pdf.jpg"));
    StorageReference pdfRef = storageRef.child("pdfs/"+file.getLastPathSegment());
    UploaduploadTask = pdfRef.putFile(file);
    
    // Register observers to listen for when the download is done or if it fails
    uploadTask.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();
    
            // ADD TO REALTIME DATABASE TOO.
            addPdfToRealtimeDatabase(downloadUrl);
        }
    }); // you might also want to add an onFailure listener.
    

    下载代码:在数据库引用中将ChildEventListener 设置为pdfs

    ChildEventListener childEventListener = new ChildEventListener() {
         @Override
         public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
             String fileName = dataSnapshot.getKey();
             String downloadUrl = dataSnapshot.getValue(String.class);
             // Add pdf to the display list.
             // displayList contains urls of pdfs to be downloaded.
             displayList.add(downloadUrl);
         }
         // Other methods of ChildEventListener go here
    };
    pdfRef.addChildEventListener(childEventListener);
    

    您可以使用displayList 下载所有可用的 PDF 并显示它们。

    注意:我已经修改了 firebase 文档中的代码 sn-ps。

    【讨论】:

    • 很好的答案 Yash!第二点我留下了自己的答案,因为我建议使用专门为此用例而存在的下载 URL,并且不需要更改安全规则。
    【解决方案2】:

    我是否必须对用户(移动应用)进行身份验证才能下载文件?

    当您将文件上传到 Cloud Storage for Firebase 时,它​​会为该文件生成一个所谓的“下载网址”。下载 URL 是一个不可猜测的 URL,它提供对文件的只读访问权限。这非常适合与您的 Android 应用程序的用户共享。

    有关如何在上传时获取文件的下载 URL 的示例,请查看此section of the Firebase documentation

    【讨论】:

      猜你喜欢
      • 2015-09-19
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 2022-11-14
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多