【问题标题】:Upload image in flutter web在flutter web中上传图片
【发布时间】:2019-11-25 13:12:19
【问题描述】:

Flutter web 仍处于技术预览阶段,但我想从磁盘中挑选一张图片并将其上传到服务器。有没有办法在我的 Flutter Web 项目中添加 HTML、JS 并与之交互?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    你可以使用 image_picker_web

    dependencies:
      image_picker_web: ^1.0.9
    

    选择图像(作为 Widget、File 或 Uint8List)和视频(作为 File 或 Uint8List)

    【讨论】:

      【解决方案2】:

      您需要 addEventListener 并且还需要附加它以在移动 safari 上唤醒它。我回答了here too

      Future<void> _setImage() async {
          final completer = Completer<List<String>>();
          InputElement uploadInput = FileUploadInputElement();
          uploadInput.multiple = true;
          uploadInput.accept = 'image/*';
          uploadInput.click();
          // onChange doesn't work on mobile safari
          uploadInput.addEventListener('change', (e) async {
              // read file content as dataURL
              final files = uploadInput.files;
              Iterable<Future<String>> resultsFutures = files.map((file) {
                  final reader = FileReader();
                  reader.readAsDataUrl(file);
                  reader.onError.listen((error) => completer.completeError(error));
                  return reader.onLoad.first.then((_) => reader.result as String);
              });
      
              final results = await Future.wait(resultsFutures);
              completer.complete(results);
          });
          // need to append on mobile safari
          document.body.append(uploadInput);
          final List<String> images = await completer.future;
          setState(() {
              _uploadedImages = images;
          });
          uploadInput.remove();
      }
      

      这也有效:

      Future<void> _setImage() async {   
          final completer = Completer<List<String>>();
          final InputElement input = document.createElement('input');
          input
            ..type = 'file'
            ..multiple = true
            ..accept = 'image/*';
          input.click();
          // onChange doesn't work on mobile safari
          input.addEventListener('change', (e) async {
            final List<File> files = input.files;
            Iterable<Future<String>> resultsFutures = files.map((file) {
              final reader = FileReader();
              reader.readAsDataUrl(file);
              reader.onError.listen((error) => completer.completeError(error));
              return reader.onLoad.first.then((_) => reader.result as String);
            });
            final results = await Future.wait(resultsFutures);
            completer.complete(results);
          });
          // need to append on mobile safari
          document.body.append(input);
          // input.click(); can be here
          final List<String> images = await completer.future;
          setState(() {
            _uploadedImages = images;
          });
          input.remove();
      }
      

      【讨论】:

      • 如果multiple = true 有没有办法指定最大选择数?
      • 你可以通过files.length查看选择的数量
      【解决方案3】:

      这将做你想要的网络。 只需从任何按钮调用它,它就会打开系统对话框来选择文件。

      import 'dart:typed_data';
      import 'package:universal_html/prefer_sdk/html.dart';    
      import '../../../providers/form_provider.dart';
      
      Uint8List uploadedImage;
      
      startFilePickerWeb(ProviderForm formProvider) async {    
        InputElement uploadInput = FileUploadInputElement();
        uploadInput.click();
      
        uploadInput.onChange.listen((e) {
          // read file content as dataURL
          final files = uploadInput.files;
          if (files.length == 1) {
            final file = files[0];
            FileReader reader = FileReader();
      
            reader.onLoadEnd.listen((e) {
            //Here I send the imatge to my Provider 
              formProvider.setLogoEmpresa(reader.result);
            });
      
            reader.onError.listen((fileEvent) {
              print("Some Error occured while reading the file");
            });
      
            reader.readAsArrayBuffer(file);
          }
        });
      }
      

      提供者:

      class ProviderForm extends ChangeNotifier {
          Uint8List logoEmpresa;
          void setLogoEmpresa(Uint8List newFile) {
             logoEmpresa = newFile;
             notifyListeners();
          }
      }
      

      然后在您的视图中,您可以像这样渲染它,以防没有图像显示附件图标:

      Container(
            width: formProvider.logoEmpresa == null
                ? 70.0
                : 90.0,
            child: formProvider.logoEmpresa == null
                ? Icon(
                    Icons.attach_file,
                    size: 70.0,
                    color: kColorPrincipal,
                  )
                : Image.memory(formProvider.logoEmpresa,
                    fit: BoxFit.fitWidth),
          ),
      

      如果您有任何问题,请提出,我会尽力提供帮助。

      【讨论】:

      • 如何使用它来发送文件?
      • 这取决于您对发送的理解。您想与平台特定的分享动作分享吗?有一些包,你想上传到 API 吗?然后在那里使用发布操作...如果我能提供帮助,请更具体地添加。
      猜你喜欢
      • 2022-11-23
      • 2019-02-03
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 2016-11-07
      • 2011-02-20
      • 1970-01-01
      相关资源
      最近更新 更多