Flutterネットワークイメージをローカルディレクトリに保存します -- dart フィールド と flutter フィールド 関連 問題

Flutter save a network image to local directory












13
vote

問題

日本語

ネットワークからローカルディレクトリに画像を保存する方法を流します。

符号化画像と復号化画像には新しいものです。誰かが正しい方向に私を指していることができますか?

英語

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?

</div
     

回答リスト

20
 
vote

これに対する簡単な答えとより複雑な答えがあります。私は複雑なものを説明し、それからあなたに単純なものを与えます。

複雑な答えは、 9988777660 を使用して画像を手動でキャッシュでき、画像ストリームを取得することができます。イメージストリームがあると、Flutterのファイルの読み取りとアンプを使用してファイルシステムに保存できます。書き込み機能(このそのはそれについての詳細を学ぶための良いリソースです) - あなたまた、そのリンクに記載されているiosとAndroidの両方の右側のパスを取得するPathProviderというプラグインを使用する必要があります。また、ダウンロードしたすべての画像を追跡し、おそらく一定時間後にそれらを削除したいと思うでしょう。 Image ウィジェットを作成する前に、ファイルを読む必要があります。

あなたにはたくさんのコントロールを与えますが、ちょっとした作業ですが(狂った金額ではありませんが、あなたがイメージを保存したい理由によるだけでなく、あなたが今すぐにしたいものではなく、あなたが今すぐにしたいものではないかもしれません) 。

簡単な答えは救助へのパッケージです!他の誰かがすでにこの問題に出かけており、あなたのためにそれを解決するプラグインを書いているので、あなたはそれについて考える必要はありません! cached_network_imageパッケージ

pubspec.yaml

に依存関係に追加する必要があります。 <事前> <コード> dependencies: cached_network_image: "^0.3.0"

インポート:

<事前> <コード> import 'package:cached_network_image/cached_network_image.dart';

を使って!

<事前> <コード> new CachedNetworkImage( imageUrl: "http://imageurl.png", placeholder: new CircularProgressIndicator(), errorWidget: new Icon(Icons.error), ),

このダウンロード&amp;画像を表示します - それらを別々にしたい場合は、 new CachedNetworkImageProvider(url) を使用して new Image を使用して表示できます。

 

There's a simple answer and a more complicated answer to this. I'll describe the complicated one and then give you the simple one.

The complicated answer is that you could manually cache images by using a NetworkImage, resolving it, and getting the image stream. Once you have the image stream, you could save it to the filesystem using flutter's file reading & writing capabilities (this is a good resource to learn more about that) - you also need to use a plugin called PathProvider which gets the right path for both iOS and Android which is described in that link. You'd also want to keep track of all the images you'd downloaded and probably delete them after certain amount of time. You'd also have to read the files back before using them to create Image widgets.

That gives you lots of control, but is a bit of work (although not a crazy amount, but if you're new to flutter maybe not something you want to do just now depending on why you want to save the images).

The simple answer is Packages to the rescue! Someone else has already come across this problem and written a plugin that solves it for you, so you don't have to think about it!

See cached_network_image package for information about the plugin.

You need to add to your dependencies in pubspec.yaml

dependencies:   cached_network_image: "^0.3.0" 

Import it:

import 'package:cached_network_image/cached_network_image.dart'; 

And use it!

new CachedNetworkImage(    imageUrl: "http://imageurl.png",    placeholder: new CircularProgressIndicator(),    errorWidget: new Icon(Icons.error), ), 

Note that this downloads & shows the image - if you want to do those seperately you can use a new CachedNetworkImageProvider(url) and show it using new Image.

</div
 
 
         
         
19
 
vote

イメージをすべてデバイスに保存する場合は、単純なget(http / http.art.dart)とファイル(Dart:Io)で簡単にこれを簡単に実現できます。そうするために、下の例で自分自身を基礎とすることができます。

 <コード>     var response = await get(imgUrl);     documentDirectory = await getApplicationDocumentsDirectory();      File file = new File(       join(documentDirectory.path, 'imagetest.png')     );      file.writeAsBytesSync(response.bodyBytes); // This is a sync operation on a real                                                 // app you'd probably prefer to use writeAsByte and handle its Future   

上記の場合には、DART PUBから「PATH_PROVIDER」パッケージを使用しました。全体的にあなたは少なくともこれらの項目を輸入したでしょう:

 <コード>     import 'dart:io';     import 'package:http/http.dart' show get;     import 'package:path/path.dart';     import 'package:path_provider/path_provider.dart';   
 

If all you want is to save an image (example: a .png) to the device, you can easily achieve this with a simple get (http/http.dart) and a File (dart:io).

To do so, you can base yourself in the example below:

    var response = await get(imgUrl);     documentDirectory = await getApplicationDocumentsDirectory();      File file = new File(       join(documentDirectory.path, 'imagetest.png')     );      file.writeAsBytesSync(response.bodyBytes); // This is a sync operation on a real                                                 // app you'd probably prefer to use writeAsByte and handle its Future 

Note that in the case above I’ve used the ‘path_provider’ package from the dart pub. In overall you would have imported at least these items:

    import 'dart:io';     import 'package:http/http.dart' show get;     import 'package:path/path.dart';     import 'package:path_provider/path_provider.dart'; 
</div
 
 
 
 
15
 
vote

コードを移動した後、そしてフラッタドキュリズムを変えた後。私はiOSとAndroidの両方で機能するメソッドとクラスを見つけました。

ヘルパークラス

 <コード> Image0  

クラスの使用

<事前> <コード> Image1
 

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),                   ],             ),           );    } } 
</div
 
 
2
 
vote

ローカルシステムでネットワークイメージを保存するには、imagePickerSave DARTプラグインを使用する必要があります。 pub.yamlファイルにDARTプラグインを追加します。 image_picker_saver:^ 0.1.0 と以下のコードを呼び出して画像を保存します。 URLはネットワークイメージのイメージURLです

<事前> <コード> Image2
 

To save the network image in local system you need to use ImagePickerSave dart plugin. Add the dart plugin in pub.yaml file: image_picker_saver: ^0.1.0 and call below code to save the image. URL is the image URL of network image

void _onImageSaveButtonPressed(String url) async {   print("_onImageSaveButtonPressed");   var response = await http       .get(url);    debugPrint(response.statusCode.toString());    var filePath = await ImagePickerSaver.saveFile(       fileData: response.bodyBytes);   var savedFile= File.fromUri(Uri.file(filePath)); } 
</div
 
 
     
     
1
 
vote

このURLに従ってくださいネットワーク画像を保存するネットワークイメージ 。

コードスニペット

<事前> <コード> Image3
 

Follow this url flutter save network image.

Code Snippet

import 'package:flutter/material.dart'; import 'dart:async'; import 'dart:io'; import 'package:path_provider/path_provider.dart'; import 'package:http/http.dart' as http;  class NetworkToLocalImage extends StatefulWidget{  String url;   NetworkToLocalImage(this.url);   @override  _LoadImages createState() => new _LoadImages(url);  }  class _LoadImages extends State<NetworkToLocalImage>{   String url;  String filename;  var dataBytes;   _LoadImages(this.url){  filename = Uri.parse(url).pathSegments.last;  downloadImage().then((bytes){   setState(() {     dataBytes = bytes;   }); }); }  Future<dynamic> downloadImage() async { String dir = (await getApplicationDocumentsDirectory()).path; File file = new File('$dir/$filename');  if (file.existsSync()) {   print('file already exist');   var image = await file.readAsBytes();   return image; } else {   print('file not found downloading from server');   var request = await http.get(url,);   var bytes = await request.bodyBytes;//close();   await file.writeAsBytes(bytes);   print(file.path);   return bytes; } }   @override  Widget build(BuildContext context) {  // TODO: implement build  if(dataBytes!=null)  return new Image.memory(dataBytes);  else return new CircularProgressIndicator(); } } 
</div
 
 
 
 
0
 
vote

icon_downloader

を使用できます。
  • iOSの場合、画像はフォトライブラリに保存されます。
  • Androidの場合、imageは Environment.DIRECTORY_DOWNLOADS または指定された場所に保存されます。 inExternalFilesDir() を呼び出すことで、許可の指定は不要になります。
  • callback() では、進捗状況を取得できます。

以下は最も簡単な例です。保存されます。

<事前> <コード> await ImageDownloader.downloadImage(url);
 

You can use image_downloader.

  • For ios, image is saved in Photo Library.
  • For Android, image is saved in Environment.DIRECTORY_DOWNLOADS or specified location. By calling inExternalFilesDir(), specification of permission becomes unnecessary.
  • By callback(), you can get progress status.

The following is the simplest example. It will be saved.

await ImageDownloader.downloadImage(url); 
</div
 
 
0
 
vote

私はこれをやってるのに多くのトラブルを持っていたので、起動時にファイルをダウンロードする簡単な例で上記の答えで少し推奨され、それをローカルディレクトリに保存したいと思いました。私は、コメント //%%% をいくつかマークして、アプリが実行される2回目の時間にコメントアウトできる行を表示しました。 (表示されるようにダウンロードする必要はないので...それはすでにデバイス自体にあります:

<事前> <コード> import 'package:flutter/material.dart'; import 'package:http/http.dart' show get; import 'dart:io'; import 'package:path_provider/path_provider.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Test Image', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: 'Test Image'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { @override initState() { _downloadAndSavePhoto(); super.initState(); } _downloadAndSavePhoto() async { // Get file from internet var url = "https://www.tottus.cl/static/img/productos/20104355_2.jpg"; //%%% var response = await get(url); //%%% // documentDirectory is the unique device path to the area you'll be saving in var documentDirectory = await getApplicationDocumentsDirectory(); var firstPath = documentDirectory.path + "/images"; //%%% //You'll have to manually create subdirectories await Directory(firstPath).create(recursive: true); //%%% // Name the file, create the file, and save in byte form. var filePathAndName = documentDirectory.path + '/images/pic.jpg'; File file2 = new File(filePathAndName); //%%% file2.writeAsBytesSync(response.bodyBytes); //%%% setState(() { // When the data is available, display it imageData = filePathAndName; dataLoaded = true; }); } String imageData; bool dataLoaded = false; @override Widget build(BuildContext context) { if (dataLoaded) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ // imageData holds the path AND the name of the picture. Image.file(File(imageData), width: 600.0, height: 290.0) ], ), ), ); } else { return CircularProgressIndicator( backgroundColor: Colors.cyan, strokeWidth: 5, ); } } }

と彼女のpubspec.yamlファイル:

<事前> <コード> http: ^0.12.0+2 path_provider: 1.5.0
 

I had a lot of trouble doing this, so I wanted to expound a little on the above answers with a simple example that downloads a file on startup, saves it to a local directory. I marked a couple of lines with the comment //%%% to show lines that can be commented out the second time that the app runs. (because it doesn't need to be downloaded to be displayed... it's already on the device itself:

import 'package:flutter/material.dart'; import 'package:http/http.dart' show get; import 'dart:io'; import 'package:path_provider/path_provider.dart';  void main() => runApp(MyApp());  class MyApp extends StatelessWidget {   @override   Widget build(BuildContext context) {     return MaterialApp(       title: 'Test Image',       theme: ThemeData(         primarySwatch: Colors.blue,       ),       home: MyHomePage(title: 'Test Image'),     );   } }  class MyHomePage extends StatefulWidget {   MyHomePage({Key key, this.title}) : super(key: key);   final String title;   @override   _MyHomePageState createState() => _MyHomePageState(); }  class _MyHomePageState extends State<MyHomePage> {   @override   initState() {     _downloadAndSavePhoto();     super.initState();   }    _downloadAndSavePhoto() async {     // Get file from internet     var url = "https://www.tottus.cl/static/img/productos/20104355_2.jpg"; //%%%     var response = await get(url); //%%%     // documentDirectory is the unique device path to the area you'll be saving in     var documentDirectory = await getApplicationDocumentsDirectory();     var firstPath = documentDirectory.path + "/images"; //%%%     //You'll have to manually create subdirectories     await Directory(firstPath).create(recursive: true); //%%%     // Name the file, create the file, and save in byte form.     var filePathAndName = documentDirectory.path + '/images/pic.jpg';     File file2 = new File(filePathAndName); //%%%     file2.writeAsBytesSync(response.bodyBytes); //%%%     setState(() {       // When the data is available, display it       imageData = filePathAndName;       dataLoaded = true;     });   }    String imageData;   bool dataLoaded = false;    @override   Widget build(BuildContext context) {     if (dataLoaded) {       return Scaffold(         appBar: AppBar(           title: Text(widget.title),         ),         body: Center(           child: Column(             mainAxisAlignment: MainAxisAlignment.center,             children: <Widget>[               // imageData holds the path AND the name of the picture.               Image.file(File(imageData), width: 600.0, height: 290.0)             ],           ),         ),       );     } else {       return CircularProgressIndicator(         backgroundColor: Colors.cyan,         strokeWidth: 5,       );     }   } } 

And heres my pubspec.yaml file:

http: ^0.12.0+2   path_provider: 1.5.0 
</div
 
 
0
 
vote

この関数を使用して、カメラからURL(ダウンロード)画像をアップロードして取得できます。 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; }); }
 

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;       });      } 
</div
 
 
0
 
vote

PARAS、CacheManager.getInstance()が推奨されていない

<事前> <コード> final DefaultCacheManager defaultCacheManager = DefaultCacheManager(); final fileInfo = await defaultCacheManager.getFileFromCache(imageUrl); ImageGallerySaver.saveImage(image); 下記はSaveImage関数です。 <事前> <コード> // 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; } }
 

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;   } } 
</div
 
 
-6
 
vote

この画像のダウンロードとサイズ変更

 

watch this Download and Resize an Image

</div
 
 
   
   

関連する質問

1  FireStore Flutterに数多くの文書を取得できません  ( Cant retrieve a number of document into firestore flutter ) 
私は問題があるので、FireStoreからStreamBuilderによって取得されたコレクションをリストに取得する必要があります。 snapshot.data.documents.lenght を使用していますが、一度追加したらエラーが発生しました: <...

0  指紋のバイオメトリックがすでに設定されているかどうかを確認する方法  ( How to check whether biometric of fingerprint is already set up or not in phone ) 
Flutterのlocal_authパッケージを使用します( https://pub.dev/packages/local_auth/example < / a>)指紋を認証するために、そのパッケージを使用している場合、指紋がすでに設定されているかどうかを検...

0  DART / FlutterプロジェクトにJSONエンコードされたデータを保存する最善の方法は何ですか?  ( Whats the best way to store the json encoded data in dart flutter project ) 
私はAPI経由で渡された大量のデータを考えていました。今まで私は以下のように物事をやっていました。私が直面している問題は、特定のレコードが以下の与えられた例のように最大7つのサブレコードを持つことができることです。これを扱う方法? 下記のデータのモデルを作成...

0  ListViewをフラッターで共有する?  ( Sharing listview in flutter ) 
私はフラッターが新しくなっています。 whatsappやメールで共有するスクロール可能なリストがあります。だから、このリストをイメージやテキストとして共有するにはどうすればいいですか?またはページ全体(スクロール可能)をイメージまたはテキストとして共有する方法...

0  Flutter&Provider:StreamProviderを2つの異なる値に聴くことができますか?  ( Flutter provider how do i make my streamprovider listen to two different val ) 
次のコードがあるとしましょう。以下のコードは、 AuthService().user の1つの値を聴くだけです。プロバイダを別の値に聴くのはどうですか?その値を呼び出しましょう。 isVoted 。 <事前> <コード> Widget build(BuildC...

0  アレイを含むフラッタカスタムクラス  ( Flutter custom class containing array ) 
これはあなたがブロークスのための簡単なものであるべきです。 私はそのようなクラスを持っています: <事前> <コード> class MenuItem { final String uid; final String category; Menu...

0  スタック内の水平リストビューはスクロールしていません  ( Horizontal list view inside stack is not scrolling ) 
<事前> <コード> Stack( childern:[ Positioned( bottom: 0, child: SizedBox(height:80,width:1000, ...

1  リストオンリスト<Dynamic>コンパレータのINTの代わりに動的に取得  ( Sort on listdynamic gets dynamic instead of int in comparator ) 
私はフラッターが新しいもので、リストを並べ替えることができないようです href="https://i.stack.imgur.com/ptwcz.png" rel="nofollow noreferrer"> 画像からのコード: <事前> <コード> ...

10  行のFractionalSizedBoxを使用してください  ( Using fractionallysizedbox in a row ) 
私は、その親に比較的大きい3つのウィジェットの行を含む任意の幅のウィジェットを持っています。 <コード> FractionallySizedBox はジョブの右側のツールのように聞こえますので、このようにみました。 <事前> <コード> Container(...

1  DART Gmail API 'Send'メソッドQualtiaPireQueStrorを返します  ( Dart gmail api send method returning detailedapirequesterror ) 
私は再構築 flutter の私の個人的なウェブサイトで、フォームが記入された後に電子メールを送る必要があります。 gmail API Dart Library を使って電子メールを送信しようとしています。 エラー:aimplyapireQuesterro...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有