如何从 Firebase 存储下载具有原始扩展名的文件?

Posted

技术标签:

【中文标题】如何从 Firebase 存储下载具有原始扩展名的文件?【英文标题】:How to download the file with original extension from Firebase storage? 【发布时间】:2017-04-20 20:08:57 【问题描述】:

我正在尝试从 Firebase 存储下载文件。但是当我下载它时,它会给出一些带有.bin 扩展名的文件。但我想得到原始文件名。

这是我的代码。

try 
            URL url = new URL(f_url[0]);
            URLConnection conection = url.openConnection();
            conection.connect();
            int lenghtOfFile = conection.getContentLength();
            InputStream input = new BufferedInputStream(url.openStream(),
                    8192);
            OutputStream output = new FileOutputStream(Environment
                    .getExternalStorageDirectory().toString()
                    +"/Download/"+ URLUtil.guessFileName(f_url[0], null, null));
            Log.i("File name",URLUtil.guessFileName(f_url[0], null, null));
            byte data[] = new byte[1024];

            long total = 0;

            while ((count = input.read(data)) != -1) 
                total += count;
                publishProgress("" + (int) ((total * 100) / lenghtOfFile));
                output.write(data, 0, count);
            
            output.flush();
            output.close();
            input.close();

         catch (Exception e) 
            Log.e("Error: ", e.getMessage());
        

f_url 是 firebase 下载网址。谢谢。

【问题讨论】:

您为什么不使用 Firebase SDK?这是文档firebase.google.com/docs/storage/android/download-files 我试过了。首先我创建了 File localFile = File.createTempFile("ayefile","",getExternalFilesDir(null));然后将该文件添加到firebase本地下载功能。但我仍然没有得到扩展。 :( 【参考方案1】:

这样做的内置方式实际上非常简单:

StorageReference reference = storage.getReferenceFromUrl("https://firebasestorage.googleapis.com/...");

// Assuming that the file is "name.extension" in Storage
String name = reference.getName().split(".")[0]
String extension = reference.getName().split(".")[1]

File localFile = File.createTempFile(name, extension);

reference.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() 
    @Override
    public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) 
        // Local temp file has been created
    
);

但是如果你不想用简单的方法来做......

让我们简要了解一下您是如何命名文件的:URLUtil.guessFileName(f_url[0], null, null)

根据URLUtil.guessFileName() 文档:“使用 URL 和 contentDisposition 猜测下载将具有的规范文件名。如果未定义文件扩展名,则根据 mimetype 添加文件扩展名。”

我假设您的f_url[0] 是一个没有扩展名的文件,并且由于您没有提供contentDispositionmimetype 作为guessFileName 的参数,因此它不可能知道您想要什么文件扩展名.

您可以从Storage Metadata 获取contentDispositioncontentType(与mimetype 相同),如果您在Storage 中使用扩展名命名您的文件,您应该可以继续使用。

【讨论】:

只是为了澄清,如果文件没有使用扩展名上传怎么办?有没有办法在创建本地 tempFile 之前根据 mime 类型获取扩展名? @AndrewLam 您可以获取元数据、获取内容类型、维护查找表(或可能使用内置 MIME 类型到扩展名的映射),然后下载文件并创建适当的扩展名。

以上是关于如何从 Firebase 存储下载具有原始扩展名的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Firebase 存储中获取调整大小的图片下载 URL

如何从 Firebase 存储中下载图像并将其存储在颤动的列表中 [关闭]

如何使用firebase_admin从python中的firebase存储下载文件

如何从 Firebase 存储下载 URL 中删除查询字符串

如何从 Android 上的 Firebase 存储正确下载多个文件?

如何让用户从 web 应用程序上的 firebase 存储下载图像?