Adds clearTemporaryFiles() method to explicitly remove cached files
- Adds Android implementation of clearTemporaryFiles(); - Adds iOS implementation of clearTemporaryFiles();
This commit is contained in:
parent
29c95c6b27
commit
030a34d72c
|
@ -1,3 +1,6 @@
|
||||||
|
## 1.9.0
|
||||||
|
Adds `clearTemporaryFiles()` that allows you to explicitly remove cached files — on Android applies typically to those picked from remote providers, on iOS _all_ picked files are cached.
|
||||||
|
|
||||||
## 1.8.0+2
|
## 1.8.0+2
|
||||||
Updates podspec to use only PhotoGallery from DKImagePickerController (thanks @jamesdixon!)
|
Updates podspec to use only PhotoGallery from DKImagePickerController (thanks @jamesdixon!)
|
||||||
|
|
||||||
|
|
|
@ -146,6 +146,11 @@ public class FilePickerPlugin implements MethodChannel.MethodCallHandler, Flutte
|
||||||
final MethodChannel.Result result = new MethodResultWrapper(rawResult);
|
final MethodChannel.Result result = new MethodResultWrapper(rawResult);
|
||||||
final HashMap arguments = (HashMap) call.arguments;
|
final HashMap arguments = (HashMap) call.arguments;
|
||||||
|
|
||||||
|
if (call.method != null && call.method.equals("clear")) {
|
||||||
|
result.success(FileUtils.clearCache(activity.getApplicationContext()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
fileType = FilePickerPlugin.resolveType(call.method);
|
fileType = FilePickerPlugin.resolveType(call.method);
|
||||||
isMultipleSelection = (boolean) arguments.get("allowMultipleSelection");
|
isMultipleSelection = (boolean) arguments.get("allowMultipleSelection");
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ import android.util.Log;
|
||||||
import android.webkit.MimeTypeMap;
|
import android.webkit.MimeTypeMap;
|
||||||
|
|
||||||
import java.io.BufferedOutputStream;
|
import java.io.BufferedOutputStream;
|
||||||
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
@ -211,12 +212,31 @@ public class FileUtils {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean clearCache(final Context context) {
|
||||||
|
try {
|
||||||
|
final File cacheDir = new File(context.getCacheDir() + "/file_picker/");
|
||||||
|
final File[] files = cacheDir.listFiles();
|
||||||
|
|
||||||
|
if (files != null) {
|
||||||
|
for (final File file : files) {
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (final Exception ex) {
|
||||||
|
Log.e(TAG, "There was an error while clearing cached files: " + ex.toString());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public static String getUriFromRemote(final Context context, final Uri uri) {
|
public static String getUriFromRemote(final Context context, final Uri uri) {
|
||||||
|
|
||||||
Log.i(TAG, "Caching file from remote/external URI");
|
Log.i(TAG, "Caching file from remote/external URI");
|
||||||
FileOutputStream fos = null;
|
FileOutputStream fos = null;
|
||||||
final String fileName = FileUtils.getFileName(uri, context);
|
final String fileName = FileUtils.getFileName(uri, context);
|
||||||
final String externalFile = context.getCacheDir().getAbsolutePath() + "/" + (fileName != null ? fileName : new Random().nextInt(100000));
|
final String externalFile = context.getCacheDir().getAbsolutePath() + "/file_picker/" + (fileName != null ? fileName : new Random().nextInt(100000));
|
||||||
|
|
||||||
|
new File(externalFile).getParentFile().mkdirs();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
fos = new FileOutputStream(externalFile);
|
fos = new FileOutputStream(externalFile);
|
||||||
|
|
|
@ -1,27 +1,8 @@
|
||||||
PODS:
|
PODS:
|
||||||
- CropViewController (2.5.2)
|
|
||||||
- DKCamera (1.6.7)
|
|
||||||
- DKImagePickerController (4.2.2):
|
|
||||||
- DKImagePickerController/Camera (= 4.2.2)
|
|
||||||
- DKImagePickerController/Core (= 4.2.2)
|
|
||||||
- DKImagePickerController/ImageDataManager (= 4.2.2)
|
|
||||||
- DKImagePickerController/InlineCamera (= 4.2.2)
|
|
||||||
- DKImagePickerController/PhotoEditor (= 4.2.2)
|
|
||||||
- DKImagePickerController/PhotoGallery (= 4.2.2)
|
|
||||||
- DKImagePickerController/Resource (= 4.2.2)
|
|
||||||
- DKImagePickerController/Camera (4.2.2):
|
|
||||||
- DKCamera
|
|
||||||
- DKImagePickerController/Core
|
|
||||||
- DKImagePickerController/Core (4.2.2):
|
- DKImagePickerController/Core (4.2.2):
|
||||||
- DKImagePickerController/ImageDataManager
|
- DKImagePickerController/ImageDataManager
|
||||||
- DKImagePickerController/Resource
|
- DKImagePickerController/Resource
|
||||||
- DKImagePickerController/ImageDataManager (4.2.2)
|
- DKImagePickerController/ImageDataManager (4.2.2)
|
||||||
- DKImagePickerController/InlineCamera (4.2.2):
|
|
||||||
- DKCamera
|
|
||||||
- DKImagePickerController/Core
|
|
||||||
- DKImagePickerController/PhotoEditor (4.2.2):
|
|
||||||
- CropViewController (~> 2.5)
|
|
||||||
- DKImagePickerController/Core
|
|
||||||
- DKImagePickerController/PhotoGallery (4.2.2):
|
- DKImagePickerController/PhotoGallery (4.2.2):
|
||||||
- DKImagePickerController/Core
|
- DKImagePickerController/Core
|
||||||
- DKPhotoGallery
|
- DKPhotoGallery
|
||||||
|
@ -50,7 +31,7 @@ PODS:
|
||||||
- SDWebImage
|
- SDWebImage
|
||||||
- SDWebImageFLPlugin
|
- SDWebImageFLPlugin
|
||||||
- file_picker (0.0.1):
|
- file_picker (0.0.1):
|
||||||
- DKImagePickerController
|
- DKImagePickerController/PhotoGallery
|
||||||
- Flutter
|
- Flutter
|
||||||
- FLAnimatedImage (1.0.12)
|
- FLAnimatedImage (1.0.12)
|
||||||
- Flutter (1.0.0)
|
- Flutter (1.0.0)
|
||||||
|
@ -70,8 +51,6 @@ DEPENDENCIES:
|
||||||
|
|
||||||
SPEC REPOS:
|
SPEC REPOS:
|
||||||
trunk:
|
trunk:
|
||||||
- CropViewController
|
|
||||||
- DKCamera
|
|
||||||
- DKImagePickerController
|
- DKImagePickerController
|
||||||
- DKPhotoGallery
|
- DKPhotoGallery
|
||||||
- FLAnimatedImage
|
- FLAnimatedImage
|
||||||
|
@ -87,11 +66,9 @@ EXTERNAL SOURCES:
|
||||||
:path: ".symlinks/plugins/flutter_plugin_android_lifecycle/ios"
|
:path: ".symlinks/plugins/flutter_plugin_android_lifecycle/ios"
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
CropViewController: 1aac40093c5739e60d992b04724a55d12a689a4c
|
|
||||||
DKCamera: a902b66921fca14b7a75266feb8c7568aa7caa71
|
|
||||||
DKImagePickerController: 4a3e7948a848c4348e600b3fe5ce41478835fa10
|
DKImagePickerController: 4a3e7948a848c4348e600b3fe5ce41478835fa10
|
||||||
DKPhotoGallery: 0290d32343574f06eaa4c26f8f2f8a1035e916be
|
DKPhotoGallery: 0290d32343574f06eaa4c26f8f2f8a1035e916be
|
||||||
file_picker: f9134d4ef376b10e950694e6b96e81dafea9ceda
|
file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1
|
||||||
FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31
|
FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31
|
||||||
Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
|
Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
|
||||||
flutter_plugin_android_lifecycle: 47de533a02850f070f5696a623995e93eddcdb9b
|
flutter_plugin_android_lifecycle: 47de533a02850f070f5696a623995e93eddcdb9b
|
||||||
|
|
|
@ -246,30 +246,9 @@
|
||||||
files = (
|
files = (
|
||||||
);
|
);
|
||||||
inputPaths = (
|
inputPaths = (
|
||||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
|
|
||||||
"${BUILT_PRODUCTS_DIR}/CropViewController/CropViewController.framework",
|
|
||||||
"${BUILT_PRODUCTS_DIR}/DKCamera/DKCamera.framework",
|
|
||||||
"${BUILT_PRODUCTS_DIR}/DKImagePickerController/DKImagePickerController.framework",
|
|
||||||
"${BUILT_PRODUCTS_DIR}/DKPhotoGallery/DKPhotoGallery.framework",
|
|
||||||
"${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework",
|
|
||||||
"${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework",
|
|
||||||
"${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework",
|
|
||||||
"${BUILT_PRODUCTS_DIR}/SDWebImageFLPlugin/SDWebImageFLPlugin.framework",
|
|
||||||
"${BUILT_PRODUCTS_DIR}/file_picker/file_picker.framework",
|
|
||||||
"${BUILT_PRODUCTS_DIR}/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework",
|
|
||||||
);
|
);
|
||||||
name = "[CP] Embed Pods Frameworks";
|
name = "[CP] Embed Pods Frameworks";
|
||||||
outputPaths = (
|
outputPaths = (
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CropViewController.framework",
|
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKCamera.framework",
|
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKImagePickerController.framework",
|
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKPhotoGallery.framework",
|
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FLAnimatedImage.framework",
|
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework",
|
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework",
|
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImageFLPlugin.framework",
|
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/file_picker.framework",
|
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_plugin_android_lifecycle.framework",
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
|
|
|
@ -9,13 +9,14 @@ class FilePickerDemo extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _FilePickerDemoState extends State<FilePickerDemo> {
|
class _FilePickerDemoState extends State<FilePickerDemo> {
|
||||||
|
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
||||||
String _fileName;
|
String _fileName;
|
||||||
String _path;
|
String _path;
|
||||||
Map<String, String> _paths;
|
Map<String, String> _paths;
|
||||||
String _extension;
|
String _extension;
|
||||||
bool _loadingPath = false;
|
bool _loadingPath = false;
|
||||||
bool _multiPick = false;
|
bool _multiPick = false;
|
||||||
FileType _pickingType;
|
FileType _pickingType = FileType.any;
|
||||||
TextEditingController _controller = new TextEditingController();
|
TextEditingController _controller = new TextEditingController();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -54,10 +55,24 @@ class _FilePickerDemoState extends State<FilePickerDemo> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _clearCachedFiles() {
|
||||||
|
FilePicker.clearTemporaryFiles().then((result) {
|
||||||
|
_scaffoldKey.currentState.showSnackBar(
|
||||||
|
SnackBar(
|
||||||
|
backgroundColor: result ? Colors.green : Colors.red,
|
||||||
|
content: Text((result
|
||||||
|
? 'Temporary files removed with success.'
|
||||||
|
: 'Failed to clean temporary files')),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return new MaterialApp(
|
return new MaterialApp(
|
||||||
home: new Scaffold(
|
home: new Scaffold(
|
||||||
|
key: _scaffoldKey,
|
||||||
appBar: new AppBar(
|
appBar: new AppBar(
|
||||||
title: const Text('File Picker example app'),
|
title: const Text('File Picker example app'),
|
||||||
),
|
),
|
||||||
|
@ -132,9 +147,17 @@ class _FilePickerDemoState extends State<FilePickerDemo> {
|
||||||
),
|
),
|
||||||
new Padding(
|
new Padding(
|
||||||
padding: const EdgeInsets.only(top: 50.0, bottom: 20.0),
|
padding: const EdgeInsets.only(top: 50.0, bottom: 20.0),
|
||||||
child: new RaisedButton(
|
child: Column(
|
||||||
onPressed: () => _openFileExplorer(),
|
children: <Widget>[
|
||||||
child: new Text("Open file picker"),
|
new RaisedButton(
|
||||||
|
onPressed: () => _openFileExplorer(),
|
||||||
|
child: new Text("Open file picker"),
|
||||||
|
),
|
||||||
|
new RaisedButton(
|
||||||
|
onPressed: () => _clearCachedFiles(),
|
||||||
|
child: new Text("Clear temporary files"),
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
new Builder(
|
new Builder(
|
||||||
|
|
|
@ -47,6 +47,13 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
_result = result;
|
_result = result;
|
||||||
|
|
||||||
|
if([call.method isEqualToString:@"clear"]) {
|
||||||
|
_result([NSNumber numberWithBool: [FileUtils clearTemporaryFiles]]);
|
||||||
|
_result = nil;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
NSDictionary * arguments = call.arguments;
|
NSDictionary * arguments = call.arguments;
|
||||||
BOOL isMultiplePick = ((NSNumber*)[arguments valueForKey:@"allowMultipleSelection"]).boolValue;
|
BOOL isMultiplePick = ((NSNumber*)[arguments valueForKey:@"allowMultipleSelection"]).boolValue;
|
||||||
if([call.method isEqualToString:@"any"] || [call.method containsString:@"custom"]) {
|
if([call.method isEqualToString:@"any"] || [call.method containsString:@"custom"]) {
|
||||||
|
|
|
@ -19,7 +19,8 @@ typedef NS_ENUM(NSInteger, MediaType) {
|
||||||
MEDIA
|
MEDIA
|
||||||
};
|
};
|
||||||
|
|
||||||
@interface FileUtils : NSObject
|
@interface FileUtils : NSObject
|
||||||
|
+ (BOOL) clearTemporaryFiles;
|
||||||
+ (NSArray<NSString*>*) resolveType:(NSString*)type withAllowedExtensions:(NSArray<NSString*>*)allowedExtensions;
|
+ (NSArray<NSString*>*) resolveType:(NSString*)type withAllowedExtensions:(NSArray<NSString*>*)allowedExtensions;
|
||||||
+ (MediaType) resolveMediaType:(NSString*)type;
|
+ (MediaType) resolveMediaType:(NSString*)type;
|
||||||
+ (NSArray*) resolvePath:(NSArray<NSURL *> *)urls;
|
+ (NSArray*) resolvePath:(NSArray<NSURL *> *)urls;
|
||||||
|
|
|
@ -9,6 +9,24 @@
|
||||||
|
|
||||||
@implementation FileUtils
|
@implementation FileUtils
|
||||||
|
|
||||||
|
+ (BOOL) clearTemporaryFiles {
|
||||||
|
NSString *tmpDirectory = NSTemporaryDirectory();
|
||||||
|
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||||
|
NSError *error;
|
||||||
|
NSArray *cacheFiles = [fileManager contentsOfDirectoryAtPath:tmpDirectory error:&error];
|
||||||
|
|
||||||
|
for (NSString *file in cacheFiles) {
|
||||||
|
error = nil;
|
||||||
|
[fileManager removeItemAtPath:[tmpDirectory stringByAppendingPathComponent:file] error:&error];
|
||||||
|
if(error != nil) {
|
||||||
|
Log(@"Failed to remove temporary file %@, aborting. Error: %@", file, error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log(@"All temporary files clear");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
+ (NSArray<NSString*> *) resolveType:(NSString*)type withAllowedExtensions:(NSArray<NSString*>*) allowedExtensions {
|
+ (NSArray<NSString*> *) resolveType:(NSString*)type withAllowedExtensions:(NSArray<NSString*>*) allowedExtensions {
|
||||||
|
|
||||||
if ([type isEqualToString:@"any"]) {
|
if ([type isEqualToString:@"any"]) {
|
||||||
|
|
|
@ -51,6 +51,17 @@ class FilePicker {
|
||||||
return filePath != null ? File(filePath) : null;
|
return filePath != null ? File(filePath) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Asks the underlying platform to remove any temporary files created by this plugin.
|
||||||
|
///
|
||||||
|
/// This typically relates to cached files that are stored in the cache directory of
|
||||||
|
/// each platform and it isn't required to invoke this as the system should take care
|
||||||
|
/// of it whenever needed. However, this will force the cleanup if you want to manage those on your own.
|
||||||
|
///
|
||||||
|
/// Returns `true` if the files were removed with success, `false` otherwise.
|
||||||
|
static Future<bool> clearTemporaryFiles() async {
|
||||||
|
return _channel.invokeMethod('clear');
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns a `List<File>` object from the selected files paths.
|
/// Returns a `List<File>` object from the selected files paths.
|
||||||
///
|
///
|
||||||
/// This is an utility method that does the same of `getMultiFilePath()` but saving some boilerplate if
|
/// This is an utility method that does the same of `getMultiFilePath()` but saving some boilerplate if
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
name: file_picker
|
name: file_picker
|
||||||
description: A package that allows you to use a native file explorer to pick single or multiple absolute file paths, with extension filtering support.
|
description: A package that allows you to use a native file explorer to pick single or multiple absolute file paths, with extension filtering support.
|
||||||
homepage: https://github.com/miguelpruivo/plugins_flutter_file_picker
|
homepage: https://github.com/miguelpruivo/plugins_flutter_file_picker
|
||||||
version: 1.8.0+2
|
version: 1.9.0
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
|
|
Loading…
Reference in New Issue