概述:
我使用文件选择库允许用户从他们的设备中选择一个或多个文件。在使用HTTP/Multipart将所选文件发送到存储之前,所选文件将具有预览功能。
问题:文件选择器库返回一个List\<PlatformFile>
,我可以访问Uint8List?
或Stream<List\<int>>?
。
将readStream
和withData
设置为True并不会同时返回Uint8List?
和Stream<List\<int>>?
--在我看来,这将是有帮助的。
如果我使用Uint8List?
,我可以使用颤振Image.memory
方法加载文件,但是我不能使用Uint8List
来使用http.MultiPartFile.fromBytes()
,因为它只接受一个List<int>
。
或者,如果我使用Stream<List<int>>?
,我可以使用http.MultipartFile()
并传入Stream<List\<int>>?
,但是我不知道如何使用Stream<List\<int>>?
生成文件/图像的预览。
我考虑过但不确定如何完成的事情
1-有没有办法将Uint8List?
转换为List<int>?
?
2-是否有使用Uint8List?
发送文件的替代方法?
3-是否有从文件选择器结果同时接收Uint8List?
和Stream<List\<int>>?
的方法?
我在下面复制了一些片段,但是如果你需要更多的信息,请告诉我。(谢谢你提前提供帮助:)
抖动Widget以选择文件
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请求= 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);
发布于 2021-04-30 13:10:10
如果我使用Uint8List?我能够使用颤振Image.memory方法加载文件,但是我无法使用Uint8List来使用http.MultiPartFile.fromBytes(),因为它只接受一个列表。
这部分不正确。Uint8List
实现了List<int>
接口,可以传递给任何需要List<int>
的函数/构造函数。因此,您可以使用MultipartFile.fromBytes
构造函数。如果您看到输入错误,很可能是因为您没有将可空类型提升为非空类型。
MultipartFile.fromBytes('files', file.bytes!)
https://stackoverflow.com/questions/67340377
复制