我正在尝试使用 Archive 库在 Dart 中编写代码,将用户上传的图像打包到 Zip 文件中,然后将该 zip 文件上传到 Firebase。但是,我的编译器说它无法打开该文件。这是我的代码:
Future<String> zipImages(List<FFUploadedFile> images) async {
final archive = Archive();
for (for final image in images; i++) {
print(image);
Uint8List? bytes = image.bytes;
Future<File> createTemporaryFile(Uint8List? bytes, int num) async {
Directory tempDir = await getTemporaryDirectory();
String tempPath = tempDir.path + '/image';
File tempFile = File(tempPath);
await tempFile.writeAsBytes(bytes as List<int>);
return tempFile;
}
File tempFile = await createTemporaryFile(bytes, i);
final bytesFromFile = await tempFile.readAsBytes();
final archiveFile =
ArchiveFile('uploadedImages', bytesFromFile.length, bytesFromFile);
archive.addFile(archiveFile);
}
final zipEncoder = ZipEncoder();
final encodedArchive = zipEncoder.encode(archive);
if (encodedArchive == null) return "error";
final zipFile = await File('images.zip').writeAsBytes(encodedArchive);
我需要在其他地方更改一些访问文件吗?请帮我解决这个问题。
这段代码似乎有一些问题。
迭代图像的循环似乎可能存在语法错误,并且函数
createTemporaryFile
是在循环内定义的,这是不必要的并且可能会导致问题。
尝试使用以下修改后的代码段,
import 'dart:io';
import 'dart:typed_data';
import 'package:archive/archive.dart';
Future<String> zipImages(List<FFUploadedFile> images) async {
final archive = Archive();
int i = 0;
for (final image in images) {
Uint8List? bytes = image.bytes;
// Creating a temporary file for each image
File tempFile = await createTemporaryFile(bytes, i);
final bytesFromFile = await tempFile.readAsBytes();
final archiveFile =
ArchiveFile('uploadedImage$i', bytesFromFile.length, bytesFromFile);
archive.addFile(archiveFile);
i++;
}
final zipEncoder = ZipEncoder();
final encodedArchive = zipEncoder.encode(archive);
if (encodedArchive == null) return "error";
final zipFile = await File('images.zip').writeAsBytes(encodedArchive);
return zipFile.path; // Returning the path to the created zip file
}
Future<File> createTemporaryFile(Uint8List? bytes, int num) async {
Directory tempDir = await getTemporaryDirectory();
String tempPath = '${tempDir.path}/image$num'; // Unique name for each image
File tempFile = File(tempPath);
await tempFile.writeAsBytes(bytes!);
return tempFile;
}
变化,
1.将
createTemporaryFile
函数的定义移到循环之外。
2.将循环迭代更改为更常规的格式。
3.为临时目录中的每个图像文件使用唯一的名称。
4.在
zipImages
函数中添加了 return 语句以返回创建的 zip 文件的路径。
确保您有正确的错误处理和必要的导入
(import 'dart:io';, import 'dart:typed_data';, and package:archive/archive.dart)
。
此外,请确保正确定义
FFUploadedFile
类或相关数据结构,并授予访问目录/文件的权限。