Baseflow / Baseflow/flutter_cache_manager
CacheManager attempts to create file named guid.* on Windows (full example included and clear description)
- Ngôn ngữ chính
- Dart
- Star
- 809
- Fork
- 510
- Merge trung bình
- 6 phút
- Pull request đã merge (30 ngày)
- 1
Mô tả
## 🐛 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;
}
```
Hướng dẫn đóng góp
Hướng nghiên cứu
Logic bị nghi ngờ nằm trong lib/src/web/file_service.dart, khoảng dòng 115; trước tiên hãy chạy bản tái hiện tối thiểu được cung cấp trên Windows và theo dõi cách header content-type trở thành phần mở rộng của tên tệp bộ nhớ đệm. Hoàn thành có nghĩa là các lượt tải xuống mà header không cung cấp phần mở rộng có thể sử dụng sẽ tạo ra tên tệp hợp lệ trên Windows, trong khi các phần mở rộng thông thường vẫn tiếp tục hoạt động.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- dart, flutter
- Lĩnh vực
- desktop
- Loại issue
- Lỗi
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức phù hợp với người mới
- 38/100