2

概述:

我正在使用文件选择器库来允许用户从他们的设备中选择一个或多个文件。所选文件将能够在使用 HTTP/Multipart 发送所选文件进行存储之前进行预览。

问题:文件选择器库返回 aList\<PlatformFile>并且我可以访问 aUint8List?或 aStream<List\<int>>?

readStreamand设置withData为 True 不会同时返回Uint8List?AND Stream<List\<int>>?- 我认为这会有所帮助。

如果我使用 ,Uint8List?我可以使用 FlutterImage.memory方法加载文件,但我无法使用Uint8List来使用 ,http.MultiPartFile.fromBytes()因为它只接受List<int>.

或者,如果我使用Stream<List<int>>?我可以使用http.MultipartFile()并传入,Stream<List\<int>>?但我不确定如何使用Stream<List\<int>>?

我考虑过但不确定如何完成的事情

1-有没有办法将a转换Uint8List?为aList<int>?

2-是否有使用发送文件的替代方法Uint8List?

3-有没有办法从文件选择器结果中同时接收Uint8List?AND ?Stream<List\<int>>?

我在下面复制了一些片段,但如果您需要更多信息,请告诉我。提前谢谢你的帮助 :)

Flutter 小部件选择文件

Text(
              "Open the File Browser",
              style: TextStyle(
                  color: kPrimaryBlue,
                  fontWeight: FontWeight.bold,
                  fontSize: 20),
            ),
            onPressed: () async {
              try {
                FilePickerResult? result =
                    await FilePicker.platform.pickFiles(
                  type: FileType.any,
                  allowMultiple: true,
                  withReadStream: false,
                  withData: true,
                );

                if (result != null) {
                  for (var file in result.files) {
                    files.add(file);
                  }
                } else {
                  print('No Files Were Selected');
                }
              } catch (ex) {
                print(ex);
              }

将文件发送到端点的 HTTP 请求:


var uri = Uri.parse('https://hookb.in/7ZGKQE8ZDOua99D3RwMD'); var request = http.MultipartRequest('POST', uri);

                  for (var file in files) {
                    request.files.add(http.MultipartFile(
                        "files", file.readStream!, file.size!,
                        filename: file.name));
                  }

                  var response = await request.send();
                  if (response.statusCode == 200) {
                    print('Uploaded!');

                    setState(() {
                      files = [];
                    });

提交前显示图像/文件的小部件:

Image(
            image: Image.memory(files[index].bytes);
4

1 回答 1

0

如果我使用 Uint8List?我可以使用 Flutter Image.memory 方法加载文件,但我无法使用 Uint8List 来使用 http.MultiPartFile.fromBytes(),因为它只接受一个列表。

这部分是不正确的。Uint8List实现List<int>接口并且可以传递给任何需要List<int>. 因此,您可以使用MultipartFile.fromBytes构造函数。如果您看到输入错误,很可能是因为您没有将可空类型提升为不可空类型。

MultipartFile.fromBytes('files', file.bytes!)
于 2021-04-30T21:10:10.633 回答