前两天使用trae+flutter尝试写一个提交本地图片到后端服务的代码,但是因为对Flutter不熟悉,弄了半天,这里简单记录一下。
- 首先在Flutter中可以使用下面的导入变量,用来判断当前环境是不是web还是app
import 'package:flutter/foundation.dart' show kIsWeb;
- 因为web浏览器的沙箱环境,所有通过image picker获得的XFile和在app中获得的XFile不太一样,从web获得的XFile其实是一个Blob对象
final XFile? image = await _picker.pickImage(source: ImageSource.gallery);
下面是ai给出的解释。
- Web 平台的安全性限制
浏览器沙箱:
Web 浏览器运行在一个沙箱环境中,出于安全考虑,浏览器不允许网页直接访问用户的本地文件系统。
这种限制旨在防止恶意网站未经用户许可访问敏感数据。
文件上传的特殊处理:
当用户通过 image_picker 选择文件时,浏览器会将所选文件存储在一个临时区域中。
为了让 Flutter Web 应用能够访问这些文件,浏览器会生成一个临时的 URL,指向该临时区域中的文件。
这个url,本质上是浏览器为这个文件创建的一个临时可访问的连接。- 临时 URL 的提供者
浏览器本身:
这个临时 URL 是由浏览器本身生成的,而不是由任何外部服务器提供的。
浏览器充当了一个临时的“文件服务器”,为 Web 应用提供对所选文件的访问权限。
这个URL的生命周期,通常和当前浏览的页面生命周期一致,当页面关闭,或者浏览器关闭,这个url就会失效。
Blob 对象:
在 Web 平台上,文件数据通常以 Blob(Binary Large Object)对象的形式存在。
浏览器可以使用 URL.createObjectURL() 方法,为 Blob 对象创建一个临时的 URL。
image_picker 内部很可能就是通过这种方式,将选择的文件,转换成Blob对象,并生成url,提供给flutter web使用。
- 然后在提交到后端之前再做一下处理就可以了