我有一个base64字符串,我想打开从该字符串生成的对应文件,但不将其保存到手机的存储中。
最初,我从这个 base64 字符串创建了一个文件并将其保存到临时存储中,然后使用 Flutter 的 open_file 插件打开它。但在我将 .apk 上传到 AppSweep 后,它返回以下问题:通过 getExternalMediaDirs 检索不安全的文件位置。我发现问题来自 open_file 库。还有其他解决办法吗?
Uint8List buffer = base64Decode(fileContent);
final directory = await getTemporaryDirectory();
int lastDotIndex = fileName.lastIndexOf('.');
String formattedFileName = fileName.substring(0, lastDotIndex);
String extension = fileName.substring(lastDotIndex + 1);
File file = File(
"${directory!.path}/${formattedFileName}.$extension");
await file.writeAsBytes(buffer);
await OpenFile.open(file.path);
问题
Insecure file location is retrieved via getExternalMediaDirs
仅在您的应用程序调用android.content.Context.getExternalMediaDirs()
时才会出现。
这是因为这些位置不是特别安全,请参阅Android Docu:
这些目录仍然存在并被扫描,但鼓励开发人员迁移到直接将内容插入 MediaStore 集合,因为从 Build.VERSION_CODES.Q 开始,任何应用程序都可以向 MediaStore 贡献新媒体,无需任何权限。
您使用的唯一与文件相关的API是
getTemporaryDirectory
,但它似乎没有存储在媒体目录中,所以我不认为这个调用是这个发现的原因。
通常,AppSweep 会向您显示其所发现内容的确切位置和代码片段,这是否可以帮助您进一步调查问题?
顺便说一句,如果您需要 AppSweep 的直接帮助,请随时使用右下角的聊天,然后您可以直接与 AppSweep 团队之一(例如我)交谈。
要在 Flutter 中打开由 Base64 字符串生成的文件而不将其保存到手机存储中,您可以结合使用内存中文件创建和合适的插件或方法来直接从内存中打开文件。截至我上次更新,Flutter 没有直接从内存中打开文件的内置方法,但您可以使用替代方法。
一种方法是使用 share_plus 插件直接从内存共享文件而不保存它。此方法会在内存中创建一个临时文件,然后使用设备的共享对话框共享它,允许用户使用设备上安装的任何兼容应用程序打开它。
以下是如何实现这一点的示例:
dependencies:
share_plus: ^4.0.4
import 'dart:convert';
import 'dart:typed_data';
import 'package:share_plus/share_plus.dart';
void shareBase64File(String base64String, String fileName) async {
Uint8List buffer = base64Decode(base64String);
// Share the file directly from memory
await Share.shareFiles(
[],
bytes: [buffer],
names: [fileName],
);
}
String base64String = "..."; // Your base64 string here
String fileName = "example.pdf"; // The file name including extension
shareBase64File(base64String, fileName);
此方法不会将文件保存到磁盘,从而避免了文件位置不安全的问题。它利用设备的共享机制来打开文件,使用户可以灵活地选择合适的应用程序来查看或处理文件。请记住,此方法取决于用户安装了可以打开您正在共享的文件类型的应用程序。