brendan-duncan/archive

Fails to import kmz file created with archive to Google Maps

Opened this issue · 4 comments

Steps to reproduce

Execute dart below with test.zip

import 'dart:io';
import 'package:archive/archive_io.dart';

void main() {
  // Read the Zip file from disk.
  final bytes = File('test.zip').readAsBytesSync();

  // Decode the Zip file
  final archive = ZipDecoder().decodeBytes(bytes);

  // Extract the contents of the Zip archive to disk.
  for (final file in archive) {
    final filename = file.name;
    if (file.isFile) {
      final data = file.content as List<int>;
      File('out/' + filename)
        ..createSync(recursive: true)
        ..writeAsBytesSync(data);
    } else {
      Directory('out/' + filename).create(recursive: true);
    }
  }

  // Zip a directory to out.zip using the zipDirectory convenience method
  var encoder = ZipFileEncoder();
  encoder.zipDirectory(Directory('out'), filename: 'out.kmz');
}

Manually create zip with

cd out && zip -r ../out2.kmz * && cd ..

Create a new Google map in My Maps

Import out.kmz file created with archive into layer - Fails

Import out2.kmz file created manually into layer - Succeeds

Added screenshot below. Difficult to debug on Google Maps as there is no error log produced.

Noticed these differences with zipinfo

  • archive zip uses "2.0 fat" and compresses "icons/" as file "rw"
  • manual zip uses "3.0 unx" and compresses "icons/" as directory "drwx".
zipinfo out.kmz
Archive:  out.kmz
Zip file size: 1287 bytes, number of entries: 3
-rw-r--r--  2.0 fat      685 b- defN 23-Jan-27 07:38 doc.kml
-rw----     2.0 fat        0 b- defN 23-Jan-27 07:38 icons/
-rw-r--r--  2.0 fat      815 b- defN 23-Jan-27 07:38 icons/place-red.png
3 files, 1500 bytes uncompressed, 973 bytes compressed:  35.1%
zipinfo out2.kmz
Archive:  out2.kmz
Zip file size: 1431 bytes, number of entries: 3
-rw-r--r--  3.0 unx      685 tx defN 23-Jan-27 07:38 doc.kml
drwxr-xr-x  3.0 unx        0 bx stor 23-Jan-27 07:38 icons/
-rw-r--r--  3.0 unx      815 bx defN 23-Jan-27 07:38 icons/place-red.png
3 files, 1500 bytes uncompressed, 961 bytes compressed:  35.9%

Screenshot from 2023-01-27 07-46-44

Don't think it's an issue with the format type "2.0 fat". Running the following forces to fat. Import into Google Maps is successful (though png is renamed so creates generic marker instead). Perhaps issue is that archive does not create "icons/" as directory.

cd out && zip -k -r ../out2.kmz * && cd ..

zipinfo out2.kmz
Archive:  out2.kmz
Zip file size: 1429 bytes, number of entries: 3
-rw----     2.0 fat      685 tx defN 23-Jan-27 07:38 DOC.KML
drwx---     2.0 fat        0 bx stor 23-Jan-27 07:38 ICONS/
-rw----     2.0 fat      815 bx defN 23-Jan-27 07:38 ICONS/PLACE-RE.PNG
3 files, 1500 bytes uncompressed, 961 bytes compressed:  35.9%

Tried using flutter_archive which successfully imports into Google Maps.

zipinfo out3.kmz
Archive:  out3.kmz
Zip file size: 1325 bytes, number of entries: 3
-rw----     2.0 fat      684 bl defN 23-Jan-31 09:14 doc.kml
-rw----     2.0 fat        0 bl defN 23-Jan-31 09:14 icons/
-rw----     2.0 fat      815 bl defN 23-Jan-31 09:14 icons/place-red.png
3 files, 1499 bytes uncompressed, 963 bytes compressed:  35.8%

Compared to archive which fails

zipinfo out.kmz
Archive:  out.kmz
Zip file size: 1287 bytes, number of entries: 3
-rw----     2.0 fat        0 b- defN 23-Jan-31 09:17 icons/
-rw-r--r--  2.0 fat      815 b- defN 23-Jan-31 09:17 icons/place-red.png
-rw-r--r--  2.0 fat      685 b- defN 23-Jan-31 09:17 doc.kml
3 files, 1500 bytes uncompressed, 973 bytes compressed:  35.1%

So really not sure why it only fails for archive. Submitted feedback request to Google about issue. As a workaround will use flutter_archive for now.

I haven't had a chance to look into the file permissions yet. I will once work settles down some.