我目前正在尝试从zip压缩文件中提取一些信息,但没有将其完全解压缩到磁盘。zip压缩文件采用标准格式:
myfile.zip
- myfile.json
- myfile.geojson
- images/
- image1.jpeg
- image2.jpeg
我使用archive_io.dart来访问存档中的信息,但我对如何从images/
子目录中获取图像感到困惑。到目前为止,我已经实现了一个打开zip存档的函数:
Archive _openArchive(String filePath) {
final inputStream = InputFileStream(filePath);
final archive = ZipDecoder().decodeBuffer(inputStream);
return archive;
/* for (ArchiveFile file in archive.files) {
if (file.isFile) {
if (file.name.contains('json') && !file.name.contains('geojson')) {
return file;
}
}
} */
}
然后在另一个函数中使用它,从myfile.json
和myfile.geojson
中读取数据。
void _extractArchiveData() async {
await _pickFiles(); //from file_picker.dart
FinalizedHike? outHike; //a class that I use for this project
var absPath = _file?.first.path.toString(); //the path of the zip archive from the file picker
//print(absPath);
if (absPath != null) {
widget.filePath = absPath;
Archive openArchive = _openArchive(absPath); //open the zip file
try {
for (ArchiveFile file in openArchive.files) {
//reads in the data from myfile.json and myfile.geosjon
if (file.isFile) {
if (file.name.contains('json') && !file.name.contains('geojson')) {
var hikeData = jsonDecode(utf8.decode(file.content));
uploadHike = FinalizedHike.fromJson(hikeData);
} else if (file.name.contains('geojson')) {
geoJson = jsonDecode(utf8.decode(file.content));
} else if (!file.isFile) {
// Code to go into the images/ subdir and pull out a specific image based off
// of a file name that I would pass in.
}
}
}
} catch (e) {
print('error ${e}');
}
}
}
我不确定这是否可行。为了创建zip压缩包,我还使用archive_io.dart,使用以下fxn:
void _createArchive() {
try {
var encoder = ZipFileEncoder();
encoder.zipDirectory(Directory(_saveAsFileName!),
filename: '$_saveAsFileName.zip');
} catch (e) {
print(e.toString());
}
}
我相信这是递归压缩,所以images/
子目录也被压缩了。我曾考虑过尝试将images/
作为InputStream
传递给ZipDecoder.decodeBuffer()
,但我不确定如何做到这一点。有没有办法将ArchiveFile
转换为InputStream
?
1条答案
按热度按时间cetgtptt1#
我做了一些深入的研究,发现你可以直接访问这些文件,它们的名字只会被标记为
images/image1.jpeg
。要仔细检查,你可以用途:退货