L.Goyal
L.Goyal

Reputation: 895

Flutter - Network Image to File

I have an Image URL like "https://example.com/xyz.jpg". Now I want to put the image in a File type variable;

Something along these lines:

File f = File("https://example.com/xyz.jpg");

The whole point is to get the image from the given URL and save it as a File variable. How can I do so? I searched for many solutions on the internet but there was no straightforward way to do so.

PS: I could have missed something where the question was similarly answered so please let me know the link where I can find it.

Edit: I am using the File type variable to pass it in the share function. This is the library that I am using.

Here is my current on share button click code

if (file != null) {
   ShareExtend.share(file.path, "image",
   sharePanelTitle: "share image title",
   subject: "share image subject");
}

Thanks for your help.

Upvotes: 14

Views: 20190

Answers (4)

Dennis Calderon
Dennis Calderon

Reputation: 11

The following worked for me:

   Future<File> urlToFile(String imageUrl) async {
      // generate random number.
      var rng = new math.Random();
      // get temporary directory of device.
      Directory tempDir = await getTemporaryDirectory();
      // get temporary path from temporary directory.
      String tempPath = tempDir.path;
      // create a new file in temporary path with random file name.
      File file = new File('$tempPath' + (rng.nextInt(100)).toString() + '.png');
      // call http.get method and pass imageurl into it to get response.
      http.Response response = await http.get(Uri.parse(imageUrl));
      // write bodybytes received in response to file.
      await file.writeAsBytes(response.bodyBytes);
      // now return the file which is created with random name in
      // temporary directory and image bytes from response is written to // that file.
      return file;
    }

That's what I call it:

 File? _image = await urlToFile('imageUrl');

based on: https://mrgulshanyadav.medium.com/convert-image-url-to-file-format-in-flutter-10421bccfd18

pdta: sorry for my English

Upvotes: -1

Lucky Martins
Lucky Martins

Reputation: 11

Future<File> fileFromImageUrl() async {
String img='https://pps.whatsapp.net/v/t61.24694-24/160266256_1115367465775510_3546030680878251116_n.jpg?ccb=11-4&oh=01_AdSsrMGOPfs8CUJsEkYImMUu5L4DAzt2ym8eBrdsMG5O0Q&oe=63D7B45E';
    final response = await http.get(Uri.parse(img));

    final documentDirectory = await getApplicationDocumentsDirectory();

    final file =
        File(p.join(documentDirectory.path, 'File Name.jpg'));

    file.writeAsBytesSync(response.bodyBytes);

    return file;
  }

Upvotes: 1

Taym95
Taym95

Reputation: 2510

You need to download image and create an empty file then fill the file with image data:


import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';

Future<File> _fileFromImageUrl() async {
    final response = await http.get(Uri.parse('https://example.com/xyz.jpg)');

    final documentDirectory = await getApplicationDocumentsDirectory();

    final file = File(join(documentDirectory.path, 'imagetest.png'));

    file.writeAsBytesSync(response.bodyBytes);

    return file;
  }

Upvotes: 17

gadgetvala
gadgetvala

Reputation: 91

import 'dart:io';   
import 'package:dio/dio.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';


Future<File> getImage({required String url}) async {
  /// Get Image from server
  final Response res = await Dio().get<List<int>>(
    url,
    options: Options(
        responseType: ResponseType.bytes,
      ),
    );

    /// Get App local storage
    final Directory appDir = await getApplicationDocumentsDirectory();

    /// Generate Image Name
    final String imageName = url.split('/').last;

    /// Create Empty File in app dir & fill with new image
    final File file = File(join(appDir.path, imageName));

    file.writeAsBytesSync(res.data as List<int>);

    return file;
}

Upvotes: 5

Related Questions