Baseflow / Baseflow/flutter_cache_manager

CacheManager attempts to create file named guid.* on Windows (full example included and clear description)

未关闭
#435 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Dart
星标
809
派生
510
平均合并
6 分钟
30 天内合并 PR
1

描述

## 🐛 Bug Report

While downloading an image from a webserver the cache manager decides to create a filename ending with .* which is not permitted on windows.

### Expected behavior

Create a filename without extension or a generic extension like .cache or .file since the cache manager cannot determine it from the webserver headers.

### Reproduction steps

i have made minimal reproducible example no external dependencies needed (other than http package)
i am aware that the server should provide correct descriptive headers for the content being served but sometimes it happens not to in some scenarios.

```
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:http/http.dart' as http;
import 'package:http/testing.dart';

Future main() async {
final client = MockClient((http.Request request) async =>
http.Response("a png image", 200, headers: {
"content-type": "application/*",
"content-disposition":
"attachment; filename=file; filename*=UTF-8''file"
}));

final cmgr = CacheManager(Config(DefaultCacheManager.key,
fileService: HttpFileService(httpClient: client)));

/* crashes with
Launching lib\main.dart on Windows in debug mode...
√ Built build\windows\runner\Debug\cache_mgr_test.exe.
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: FileSystemException: Cannot open file, path = 'C:\Users\csman\AppData\Local\Temp\libCachedImageData\cf09f070-6cef-1d8a-b096-2334712b3134.*' (OS Error: The filename, directory name, or volume label syntax is incorrect.

, errno = 123)
#0 _checkForErrorResponse (dart:io/common.dart:55:9)
#1 _File.open. (dart:io/file_impl.dart:381:7)

*/

await cmgr.downloadFile("http://myaddress.com/imageManager?pngfileid=1234");
}

/*
pubspec.yaml

name: cache_mgr_test
description: A new Flutter project.
publish_to: "none"
version: 1.0.0+1
environment:
sdk: ">=3.1.5 <4.0.0"
dependencies:
cupertino_icons: ^1.0.2
flutter:
sdk: flutter
flutter_cache_manager: ^3.3.1
http: ^1.1.0
dev_dependencies:
flutter_lints: ^2.0.0
flutter_test:
sdk: flutter
flutter:
uses-material-design: true
*/

```

### Configuration

**Version:** 3.3.1

**Platform:**
Windows 10

I think the problematic part is in \flutter_cache_manager-3.3.1\lib\src\web\file_service.dart line 115 around
```
@override
String get fileExtension {
var fileExtension = '';
final contentTypeHeader = _header(HttpHeaders.contentTypeHeader);
if (contentTypeHeader != null) {
final contentType = ContentType.parse(contentTypeHeader);
fileExtension = contentType.fileExtension;
}
return fileExtension;
}
```

贡献指南

打开贡献指南

调研方向

疑似逻辑位于 lib/src/web/file_service.dart 第 115 行附近;首先在 Windows 上运行提供的最小复现,并跟踪 content-type 标头如何变成缓存文件名的扩展名。完成的标准是:对于标头未提供可用扩展名的下载,能够创建符合 Windows 要求的文件名,同时普通扩展名仍能正常工作。

由索引模型根据 Issue 内容生成。

评估

技术栈
dart, flutter
领域
desktop
Issue 类型
缺陷
难度
2/5
预计耗时
1-3 小时
活跃度
停滞
描述清晰度
描述清楚
新手友好度
38/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。