diff --git a/lib/Screens/Resources/resource_body_grid.dart b/lib/Screens/Resources/resource_body_grid.dart index 77973cd..b6a75db 100644 --- a/lib/Screens/Resources/resource_body_grid.dart +++ b/lib/Screens/Resources/resource_body_grid.dart @@ -492,9 +492,9 @@ class _ResourceBodyGridState extends State { TextButton.icon( icon: const Icon(Icons.download, size: 16), label: Text(l.download, style: const TextStyle(fontSize: 12.5)), - onPressed: () { + onPressed: () async { for (final resource in selected) { - downloadResource(resource); + await downloadResource(resource); } }, ), diff --git a/lib/Screens/Resources/resource_download.dart b/lib/Screens/Resources/resource_download.dart index 9ffcbb0..8e5c8d5 100644 --- a/lib/Screens/Resources/resource_download.dart +++ b/lib/Screens/Resources/resource_download.dart @@ -8,12 +8,29 @@ import 'resource_formatting.dart'; /// /// L'ancienne modale forçait `'${label}.json'` quel que soit le type : un PNG /// arrivait en `mon-image.json` et ne s'ouvrait nulle part sans renommage. -void downloadResource(ResourceDTO resource) { +/// +/// Le fichier est d'abord récupéré en blob : l'attribut `download` d'un lien est +/// ignoré quand la cible est sur une autre origine (Firebase Storage ici), et le +/// navigateur se contentait d'ouvrir la ressource dans un onglet. Si la requête +/// échoue (CORS, réseau), on retombe sur l'ouverture dans un nouvel onglet. +Future downloadResource(ResourceDTO resource) async { final url = resource.url; if (url == null) return; - final anchor = html.AnchorElement(href: url) - ..download = downloadFileNameFor(resource) - ..target = '_blank'; - anchor.click(); + final fileName = downloadFileNameFor(resource); + + try { + final request = await html.HttpRequest.request(url, responseType: 'blob'); + final blob = request.response as html.Blob; + final objectUrl = html.Url.createObjectUrlFromBlob(blob); + html.AnchorElement(href: objectUrl) + ..download = fileName + ..click(); + html.Url.revokeObjectUrl(objectUrl); + } catch (_) { + html.AnchorElement(href: url) + ..download = fileName + ..target = '_blank' + ..click(); + } }