Flutter之下载网络图片并保存到本地文件夹

图片地址:https://img03.sogoucdn.com/v2/thumb/retype_exclude_gif/ext/auto/crop/xy/ai/w/1284/h/722?appid=200698&url=https://pic.baike.soso.com/ugc/baikepic2/24446/cut-20211222173333-829293243_jpg_1308_872_50708.jpg/0

因为图片是二进制数据的形式存储在计算机中的,所以保存图片到本地必须使用二进制数据。

下载图片

  • 使用已经封装好的Dio.get方法,详情可见Flutter之Dio封装+实例(自己梳理)_YUFENGSHI.LJ的博客-CSDN博客
  • 传入图片网址
  • 将返回的数据类型设置为二进制类型
    //下载图片
      var result = await HttpManager.getInstance().get(
          "https://img03.sogoucdn.com/v2/thumb/retype_exclude_gif/ext/auto/crop/xy/ai/w/1284/h/722?appid=200698&url=https://pic.baike.soso.com/ugc/baikepic2/24446/cut-20211222173333-829293243_jpg_1308_872_50708.jpg/0",
          //将返回类型设置为二进制,此时的result是二进制数据,保存的是图片的字节数组
          option: Options(responseType: ResponseType.bytes));

    选择本地文件夹

    此时需利用file_picker: ^5.3.3 包

    • 添加依赖

      •  选择文件目录

        //选择文档目录
          //selectedDirectory是选择的文件夹的地址  C:\Users\lanlian\Desktop\沈成林\休闲娱乐来一套\下载图片
          String? selectedDirectory = await FilePicker.platform.getDirectoryPath();
          if (selectedDirectory == null) {
            print("请选择正确的文件地址");
            return;
          }
        else{}

        此时需要判断选择的文档地址是否为空,如果则退出选择,不为空则继续操作

        保存图片

        • 创建一个名为$name的新文件(要将图片保存到这里)

          此时需要判断保存的图片是否已经存在,如果已经存在则退出

          //创建一个名为download1.jpg的新文件
              File image_file=File('${selectedDirectory}/download1.jpg');
              if(image_file.existsSync()){
                print("图片已存在");
                return;
              }
          • 将下载获取的图片的字节信息写入这个新文件
             //从网络上下载的图片的字节数组写入该文件中。
                image_file.writeAsBytes(result);

            完整代码 

            Future saveImage() async {
              print("保存图片到本地");
              //下载图片
              var result = await HttpManager.getInstance().get(
                  "https://img03.sogoucdn.com/v2/thumb/retype_exclude_gif/ext/auto/crop/xy/ai/w/1284/h/722?appid=200698&url=https://pic.baike.soso.com/ugc/baikepic2/24446/cut-20211222173333-829293243_jpg_1308_872_50708.jpg/0",
                  //将返回类型设置为二进制,此时的result是二进制数据,保存的是图片的字节数组
                  option: Options(responseType: ResponseType.bytes));
              //选择文档目录
              //selectedDirectory是选择的文件夹的地址  C:\Users\lanlian\Desktop\沈成林\休闲娱乐来一套\下载图片
              String? selectedDirectory = await FilePicker.platform.getDirectoryPath();
              if (selectedDirectory == null) {
                print("请选择正确的文件地址");
                return;
              }
              else{
                print("selectedDirectory:${selectedDirectory}");
                //创建一个名为download1.jpg的新文件
                File image_file=File('${selectedDirectory}/download1.jpg');
                if(image_file.existsSync()){
                  print("图片已存在");
                  return;
                }
                //从网络上下载的图片的字节数组写入该文件中。
                image_file.writeAsBytes(result);
              }
            }