Flutter save a network image to local directory

后端 未结 10 608
情歌与酒
情歌与酒 2020-12-24 08:52

In Flutter how to save an image from network to the local directory.

I am new to encoding and decoding images. Can anyone point me in the right direction?

相关标签:
10条回答
  • 2020-12-24 09:42

    you can use this function to upload and get Url(download) Image from the camera using firebase-storage

     Future _upIm()async {
          final StorageReference firebaseStorageRef =
          FirebaseStorage.instance.ref().child(DateTime.now().toString());
          final StorageUploadTask task =
          firebaseStorageRef.putFile(_storedImage);
    
          var downUrl=await (await task.onComplete).ref.getDownloadURL();
          var url =downUrl.toString();
          print(url);
    
          setState(() {
            uploadImage=url;
          });
    
        }
    
    0 讨论(0)
  • 2020-12-24 09:51

    After wandering around the codes and flutter docs. I have found the methods and classes which would work for both iOS and Android and here it goes.

    Helper Classs

    import 'dart:async';
    import 'dart:io' as Io;
    import 'package:image/image.dart';
    
    import 'package:flutter_cache_manager/flutter_cache_manager.dart';
    import 'package:path_provider/path_provider.dart';
    class SaveFile {
    
      Future<String> get _localPath async {
        final directory = await getApplicationDocumentsDirectory();
    
        return directory.path;
      }
       Future<Io.File> getImageFromNetwork(String url) async {
    
         var cacheManager = await CacheManager.getInstance();
         Io.File file = await cacheManager.getFile(url);
         return file;
       }
    
       Future<Io.File> saveImage(String url) async {
    
        final file = await getImageFromNetwork(url);
        //retrieve local path for device
        var path = await _localPath;
        Image image = decodeImage(file.readAsBytesSync());
    
        Image thumbnail = copyResize(image, 120);
    
        // Save the thumbnail as a PNG.
        return new Io.File('$path/${DateTime.now().toUtc().toIso8601String()}.png')
          ..writeAsBytesSync(encodePng(thumbnail));
      }
    }
    

    Usage of class

    class HomePageState extends State<HomePage>{
    
    Future<Null> _launched ;
    
      Widget _showResult(BuildContext context, AsyncSnapshot<Null> snapshot){
        if(!snapshot.hasError){
          return Text('Image is saved');
        }
        else{
          return const Text('Unable to save image');
        }
      }
    
      Future<Null> _saveNetworkImage(String url) async{
        try{
           await SaveFile().saveImage(url);
        }
        on Error catch(e){
          throw 'Error has occured while saving';
        }
      }
       @override
       Widget Build(BuildContext context){
           return new Scaffold(
                key: _scaffoldKey,
                appBar: new AppBar(
                    title: new Text('Image'),
                ),
                body: Column(
                      children: <Widget>[
                           IconButton(icon: Icon(Icons.save), onPressed: (){
                         setState(() {
                           _launched =_saveNetworkImage(url);
                         });
                        }),
                          new FutureBuilder<Null>(future: _launched ,builder: _showResult),
                      ],
                ),
              );
       }
    }
    
    0 讨论(0)
  • 2020-12-24 09:53

    inspired by Paras,CacheManager.getInstance() is deprecated

    final DefaultCacheManager defaultCacheManager = DefaultCacheManager();
    final fileInfo = await defaultCacheManager.getFileFromCache(imageUrl);
    ImageGallerySaver.saveImage(image);
    

    below is saveImage function

    // save raw data to gallery with permission
    static Future<void> saveImage(Uint8List image) async {
      try {
        if (Platform.isIOS) {
          await PermissionHandler().requestPermissions([PermissionGroup.photos]);
          PermissionStatus permission = await PermissionHandler().checkPermissionStatus(PermissionGroup.photos);
          if (permission == PermissionStatus.granted) {
          } else {
            throw 'denied';
          }
        } else if (Platform.isAndroid) {
          await PermissionHandler().requestPermissions([PermissionGroup.storage]);
          PermissionStatus permission = await PermissionHandler().checkPermissionStatus(PermissionGroup.storage);
          if (permission == PermissionStatus.granted) {
          } else {
            throw 'denied';
          }
        }
        await ImageGallerySaver.saveImage(image);
      } catch (e) {
        throw e;
      }
    }
    
    0 讨论(0)
  • 2020-12-24 09:59

    watch this Download and Resize an Image

    0 讨论(0)
提交回复
热议问题