BioforestChain / dweb_browser

BioforestChain Infrastructure
https://docs.dweb-browser.org
MIT License
13 stars 4 forks source link

【提案】🎉 fs-picker.sys.dweb 文件选择器 #58

Open Gaubee opened 11 months ago

kingsword09 commented 11 months ago

https://wicg.github.io/file-system-access/#api-showopenfilepicker

暴露的API是否去模仿web标准

Gaubee commented 11 months ago

https://wicg.github.io/file-system-access/#api-showopenfilepicker

暴露的API是否去模仿web标准

还需要参考 Android 文档:https://developer.android.com/training/data-storage/shared?hl=en

Gaubee commented 11 months ago

@huang493 你提供以一下IOS的相关文档

huang493 commented 11 months ago

可以直接使用控件:UIDocumentPickerViewController来提供对系统File App的访问。 使用参考文档: https://developer.apple.com/documentation/uikit/view_controllers/providing_access_to_directories 需要特别注意的是:可能会访问到iCloud的数据。

Gaubee commented 11 months ago

初步方案为:

  1. /open-file?accpet=*&multiple=*&limit=* 选择文件
    1. accpet 的格式为mime:ext,ext;mime:ext,比如:image/*:.jpg,.png;video/*:.mp4
    2. multiple 是一个 boolean,意味着是否开启多选
    3. limit 意味着需要用户最多选择几个文件,如果为 0 或者空,则不限制
    4. 在 Android 的实现中,如果 accpet 是 image/* 或者 video/* 则使用 照片选择器(如果支持的话)
    5. 返回一个数组string[],内容是虚拟路径:file:///picker-file/:fdid/:filename
      1. 这是一个虚拟的路径,模块开发者需要将这个虚拟的路径映射到真实的句柄对象上
      2. 我们不能暴露真实的路径,用户只是选择文件,我们不应该将路径也给到模块,否则这可能会变成设备指纹。甚至我们应该提供一个默认选项:“模糊文件名”,意味着默认情况下选择的文件都会被默认重命名成日期,除非用户刻意取消这个选项,意味着将文件名也一并提交。
      3. 这里的 fdid 是一个根据 ipc 通讯对象与真实的文件路径组合计算出来的值,因为多个模块可能同时对一个句柄同时进行访问,所以需要区分会话对象,必要时需要进行排队访问
      4. 如果没有 fdid,就会出现 file:///picker-file/file.txtfile:///picker-file/file.txt 无法区分背后其实是 file:///download/file.txtfile:///document/file.txt
      5. 获得虚拟路径后,可以用 file.std.dweb 模块对文件进行标准操作
  2. /directory?mode=*&startIn=*&preference=* 选择目录
    1. mode 为 readonly|readwrite
    2. preference 提供一个虚拟路径,如果平台支持,并且这个路径存在,那么将文件夹的起点设定在这个路径下。虽然是虚拟路径是计算出来的,当并不代表我们能方向推导出原本的路径,因此我们不能无上限地存储这些虚拟路径所映射的真实路径,因此这个偏好值可能失效,这时候,我们将采用 startIn 作为初始的建议路径
    3. startIn 为 desktop|documents|downloads|music|pictures|videos|... 取决于操作系统支持的程度,这里这是提供一个建议路径
    4. 返回一个虚拟路径:file:///picker-directory/:fdid/:dirname 该虚拟路径的原理参考 /open-file 的返回值
  3. /save-file?suggestedName=*&startIn=*&preference=* 保存文件
    1. suggestedName 为默认的文件名称
    2. startIn 与 preference 参考 /directory 的同名参数
    3. 返回值是一个虚拟路径 file:///picker-file/:fdid/:filename 这和 /open-file 是同样的效果,接下来也可以对这个文件进行读写操作。比如说应用保存了一个.pdf 文件,那么接下来应用的生命周期中,都可以对这个文件持续进行读写
  4. 对于每一个会话,本模块会尽可能保存这些虚拟路径,默认是最少 16 个路径,如果应用的使用时间的时长较长或者较为频繁,那么可以提供一定的伸缩性,最高可以存到 64 个,对于长期没有使用的模块,那么这些缓存会被移动到缓存文件夹,直到被自动清理,在被清理之前,如果被重新访问,那么会回到持久化文件夹。

@kingsword09 @huang493 @jackie-yellow 你们看一下各个平台能否实现以上设计,能实现到什么程度。 看一下这个设计还需要怎么调整

jackie-yellow commented 5 months ago

ios版本的文件选择器(openFileChooser)的实现并不标准,请参考web-accept的定义,做完整实现。 (可以参考desktop的实现,它是更朴实的实现)

参考资料: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept#limiting_accepted_file_types

20240312-162757