资源
处理笔记附件
创建资源
你将注意到我们没有提供 NoteStore.createResource 这个 API 调用。这是因为 Resources 并不独立于具体笔记的内容而存在。相反,在你调用NoteStore.createNote 或 NoteStore.updateNote 来包含一个 Resource 对象时,Resources 被隐式地创建了。一个笔记可以包含零到多个资源,并且每个资源都包含它文件的二进制内容和一系列可选的元数据属性(比如文件名)。
要想把一个资源附加到一条笔记中,你需要把它加入到Note.resources列表中并且在笔记的ENML内容中用<en-media>标签引用它。把资源加入到Note.resources中但并没有添加对应的<en-media>标签在技术上是允许的,但这样用户就无法从印象笔记的客户端来查看这个资源了,而且也不敢保证应用不会将这些孤立的资源给删除掉。
把一个资源附加到一个笔记上需要做两件事。你需要把资源包含在 Note.resources 列表,并且在笔记的ENML 内容中使用<en-media>标签引用这个资源。在技术上,虽然只把资源添加到 Note.resources 列表而不添加对应的<en-media>标签是可行的,但是这样的话用户就没有办法使用印象笔记客户端应用来查看这个资源,并且也不能保证应用不移除这些“孤儿”(orphaned)资源。
创建笔记章节包含了一个创建带有附加资源的笔记的例子。
资源类型
所有的印象笔记客户端都支持在显示笔记的时候同时显示笔记中的图像资源。其他资源类型如何显示取决于显示笔记的特定的客户端。例如,一些客户端在笔记内容中显示 PDF 文件内容,而其他一些客户端只显示一个 PDF 图标,当你点击这个图标时,一个外部的查看器会打开这个 PDF。几乎所有的印象笔记客户端应用都可以直接显示或允许用户打开下面这些基本的资源类型:
- image/gif
- image/jpeg
- image/png
- audio/wav
- audio/mpeg
- audio/amr
- application/pdf
其他类似文档(documents)的资源类型通常被显示为各自的文件图标。如果用户安装了能够打开这个文件类型的外部程序,当用户选择打开这个文件的时候,这个外部程序就会被调用。
下载资源
当你通过云 API获取一条笔记的时候,它包含附加到该笔记的所有资源的列表。如果你是通过使用NoteStore.findNotes或者NoteStore.findNotesMetadata获取的笔记,笔记将只包含资源的元数据而而不包括真实的二进制文件数据。如果你使用NoteStore.getNote来获取的笔记,你可以通过参数 'withResourcesData' 来控制返回的笔记是否包含二进制文件数据。如果你有一条笔记只包含资源的元数据,那么有两种方法可以获取二进制文件数据。
通过 API 下载资源
要通过云 API 来获取完整的资源,可以直接调用 NoteStore.getResource并设置 'withData' 域的值为 true。
值得注意的是,文件名是一个可选的资源属性——有些资源可能并没有设置文件名。
直接通过网络下载资源
使用云 API 来获取资源数据时有一个重要的问题你要注意:整个文件内容是被下载到内存中的并且不容易以流的形式读取(streamed)。要避免此问题,你可以通过 HTTP POST 请求直接从印象笔记服务获取资源。首先,你需要获取webApiUrlPrefix
的值(OAuth响应会返回这个值,或者调用UserStore.getPublicUserInfo
)。在webApiUrlPrefix
后加上/res/[resource GUID]
,你就可以得到该资源的完整的URL地址:
这是构造资源请求的首选方法,使用这种方法可以向前兼容。
The authentication token must be passed in order to access a resource that is not in a public shared notebook. The token is passed in a URL-encoded POST parameter named auth
. Here's how the authenticated POST request for the resource with GUID 8528dddd-1d71-4e4d-9006-377be7517dfb looks:
要访问不在共享笔记本中的资源,必须传入认证 token。这个 token 在 URL 编码的 POST 参数 auth
中传递。这里展示了认证的 POST 请求如何获取 GUID 为 8528dddd-1d71-4e4d-9006-377be7517dfb 的资源: