上传¶
上传功能可将许多部手机上已完成的 Session 发送到同一个项目文件夹。项目负责人只需设置一次文件夹并分发一个链接或 QR 码;每位贡献者粘贴或扫描它,此后任何 Session 都可以在分享对话框中点按两下发送到该文件夹。ARU 部署可以自行发送每个已完成的 Session。
上传是单向的。应用只会向项目文件夹写入文件,绝不会读取、列出或删除其中的任何内容。在手机上删除 Session 不会影响已上传的副本;除非您勾选了某个目标或开启了自动上传 ARU Sessions,否则绝不会上传任何内容。
工作原理¶
目标是应用可以写入的 WebDAV 文件夹。开箱即用支持三种类型:
- Nextcloud File Drop 分享,是大多数项目的推荐选择;
- 任何带用户名和密码的 WebDAV 地址,例如您自己云账户中的文件夹或机构服务器;
- BirdNET Live 随附的参考投递服务器,适合需要按贡献者分配令牌和现成 CSV 导出的负责人(参见 Developer Guide)。
每次上传都是每个 Session 一个 ZIP 文件,命名方式与分享导出相同,例如 BirdNET_Live_2026-05-14_06-30-00_#13.zip。它始终包含该 Session 的 JSON 记录,并根据您的勾选包含音频、检测表格、HTML 报告和应用元数据文件。ZIP 会存放在以您的上传 ID 命名的文件夹中,这是一个八位字符的代码,由应用从为本次安装保留的随机身份标识推导而来。因此项目负责人的文件夹看起来是这样的:
4ee91c8f/BirdNET_Live_2026-05-14_06-30-00_#13.zip
4ee91c8f/BirdNET_Live_2026-05-14_07-02-10_#14.zip
b27c0e51/BirdNET_Live_2026-05-14_06-45-00_#3.zip
.birdnet-live/4ee91c8f.json
.birdnet-live/b27c0e51.json
.birdnet-live 文件夹为每台设备保存一个由连接测试写入的小型注册文件。除非开启了“显示隐藏文件”,Nextcloud 不会显示它。该文件包含上传 ID、应用版本、平台,以及贡献者选填的参与者标识(姓名、邮箱或参与者编号),这样负责人就能知道每个代码背后是谁,而任何姓名都不会成为文件夹名称。同一标识也会写入每个已上传 Session 的 JSON 记录中。
面向项目负责人¶
方案 A:Nextcloud File Drop¶
- 在 Nextcloud 中为项目创建一个文件夹,例如
Spring Survey 2027。 - 打开其分享面板,创建一个分享链接,并将其权限设为 File Drop(仅上传)。这样贡献者可以添加文件,但永远看不到其他人发送的内容。
- 为链接设置密码。没有密码时,任何发现该链接的人都可以向该文件夹上传。即便如此,File Drop 也无法被读取,因此不设密码是一种应用会接受而不会提出异议的选择。
- 可选择为项目结束设置一个过期日期。
- 复制分享链接。它看起来像
https://cloud.example.org/s/AbCdEf123456。
应用会自行把该链接转换为该分享的 WebDAV 端点;贡献者永远不会看到 WebDAV 地址。File Drop 从不覆盖:当贡献者再次上传同一个 Session 时,Nextcloud 会以带编号的名称保留旧副本,因此不带编号的文件就是最新的那一个。
具有上传和编辑权限的 Nextcloud 分享同样可用,但应用会警告贡献者该凭据可以列出文件夹内容,因为此时任何拥有链接的人都能读取其他所有人的数据。只读分享会被连接测试拒绝。
方案 B:您自己的 WebDAV 文件夹¶
任何 WebDAV 服务器都可以:个人云账户中的文件夹、机构文件服务器、ownCloud,或使用普通账户的 Nextcloud。贡献者在加入时于高级下输入地址以及用户名和密码。对于 Nextcloud 或 ownCloud 账户,请使用账户安全设置中的应用密码,切勿使用登录密码;当只给出主机名时,应用还会尝试该主机上常见的 Nextcloud 和 ownCloud 路径。
这类凭据通常可以读取文件夹,因此连接测试会显示警告。当贡献者并非都属于同一个团队时,请优先采用只写设置。
方案 C:参考投递服务器¶
源代码仓库中的 tools/webdav_drop_server 是一个小型 Python 服务器,提供可撤销的按贡献者分配的令牌、一个把每个已上传的 JSON 记录合并为 sessions.csv、detections.csv 和 species_summary.csv 的 collect 命令,以及一个打印加入链接和 QR 码的 invite 命令。安装和部署方法见 Developer Guide。
生成加入链接和 QR 码¶
加入链接把贡献者所需的一切合为一体:目标、凭据、项目名称以及您建议的默认值。打开本站点的加入页面并填写:
- Share link or WebDAV address(分享链接或 WebDAV 地址):上面的 Nextcloud 分享链接,或 WebDAV 文件夹地址。
- User name(用户名):Nextcloud 分享链接请留空。
- Share password or token(分享密码或令牌):分享密码,或账户或令牌的密钥。
- Project name shown in the app(应用中显示的项目名称):贡献者将看到的目标名称。他们可以重命名,但这是默认值。
- Suggest including audio(建议包含音频)和 Suggest Wi-Fi only(建议仅 Wi-Fi):目标各开关的默认值。
点按 Build link and QR code(生成链接和 QR 码)。一切都在您的浏览器中完成;不会向任何地方发送任何内容。密钥位于链接中 # 之后的部分,浏览器绝不会把这部分传给托管该页面的 Web 服务器。
或者,先在您自己的手机上加入该目标(见下文),然后在设置 → 导出与同步 → 上传目标中打开该目标并点按显示加入码。应用会显示同类的 QR 码,并带有复制链接按钮。
分发¶
把 QR 码打印在野外记录表上、在简报会上显示在屏幕上,或者通过消息发送链接。请像对待密码一样对待该链接和代码:任何持有它的人都可以向您的项目上传。如果泄露,请更改分享密码或撤销令牌,并分发新的代码。
当贡献者用手机相机扫描该码时,浏览器会打开一个小型落地页,其中有一个 Open in BirdNET Live(在 BirdNET Live 中打开)按钮,点按后进入应用的添加目标界面,链接已自动填入。直接把链接粘贴到该界面中效果完全相同。
您将看到什么¶
每台设备一个文件夹,每个 Session 一个 ZIP,以及隐藏的 .birdnet-live 注册文件。打开一个 ZIP,可以找到 JSON 记录(始终存在),以及贡献者选择包含的表格、报告和音频。要了解某个上传 ID 背后是哪个人,请阅读该代码的注册文件,或其任一 JSON 记录中的 meta.participant 字段。使用参考投递服务器时,collect 会替您完成这一步并写入 participant 列。
面向贡献者¶
加入目标¶
- 打开设置 → 导出与同步 → 上传目标并点按添加目标。用相机扫描项目的 QR 码,或点按收到的加入链接,会进入同一界面,且链接已自动填入。
- 把加入链接、Nextcloud 分享链接或 WebDAV 地址粘贴到加入链接或服务器地址中。粘贴按钮会从剪贴板取用。
- 可选填写参与者 ID、姓名或邮箱(可选)。它会随每次上传一起保存,以便项目负责人知道是谁发送的,并且绝不会出现在文件夹名称中。字段下方应用会显示您的上传 ID,即您的上传将落入的文件夹。
- 对于普通 WebDAV 地址,请展开高级并输入用户名和密码或令牌。Nextcloud 分享链接两者都不需要;如果分享设有密码,请把它作为密码输入。
- 点按测试连接。应用会联系服务器、创建隐藏的注册文件夹、检查凭据是否可以列出文件夹内容,并写入您的注册文件。结果是一句话:连接正常、一条您应当阅读的警告,或一条附带可能解决办法的失败信息。
- 为目标设置目标名称(由加入链接预填),决定是否仅通过 Wi-Fi 上传和自动上传 ARU Sessions,然后点按保存目标。通过扫码或点按链接添加时,应用随后会转到上传目标。
在测试通过之前不会保存任何内容。凭据存入设备钥匙串,绝不会进入导出的数据。
值得了解的警告:
- 此凭据可以列出目标内容,因此可能读取其他贡献者的数据。建议改用 File Drop 分享或只写令牌。表示该分享或账户可以读取其他贡献者的数据。上传可以进行,但如果项目涉及团队以外的人,请向负责人索取 File Drop 或只写令牌。
- 该分享没有密码且可以列出内容,任何拥有链接的人都能读取其他参与者的数据。请让项目负责人设置密码或改用 File Drop。同时包含上述两种风险:任何拥有链接的人都能读取全部内容。请让负责人设置密码或改用 File Drop。
- 此服务器不允许创建文件夹,因此上传将使用扁平的文件名。只是提示信息:上传会使用诸如
4ee91c8f__BirdNET_Live_….zip的扁平文件名,而不是文件夹。
目标界面¶
在列表中点按某个目标会打开其界面,显示服务器地址、添加时间和上次使用时间,以及下列控件:
- 重命名(应用栏中的铅笔图标)更改应用中显示的名称。
- 仅通过 Wi-Fi 上传在手机使用移动网络时暂缓上传。
- 自动上传所有 Sessions把任何模式下每个已完成的 Session 加入该目标的队列,无需询问,并使用导出与同步中音频和元数据的默认值。开启期间,自动上传 ARU Sessions也保持开启。之后在 Session Review 中丢弃某个 Session 时,尚未开始的上传会被取消,但已发送的内容仍保留在服务器上。
- 自动上传 ARU Sessions把每个已完成的 ARU Session 加入该目标的队列,无需询问(见下文)。
- 测试连接重新运行连接测试,例如在负责人更改密码之后。
- 显示加入码显示一个 QR 码以及复制链接,让第二部手机可以加入同一目标。
- 移除目标会忘记该目标及其凭据,并丢弃发往它的待上传项目。已上传的 Session 仍保留在服务器上。
目标列表的第一项是您的上传 ID,其下方是参与者标识;点按即可更改标识。更改它不会移动服务器上的任何内容,因为文件夹是按 ID 命名的。
上传 Session¶
上传从您已经在使用的同一个分享操作开始,共有三处入口:
- Session 列表中 Session 卡片的三点菜单( );
- 在 Session 列表中选中多个 Session 后的分享按钮;
- Session 回顾工具栏中的分享图标( )。
一旦至少存在一个目标,分享对话框就会有两个标签页:
- 内容选择导出包含什么:音频(完整录音,或在只保留了片段时为检测片段)和元数据(在导出与同步下启用的表格、报告和应用元数据文件)。选项框的初始状态与您的设置一致,并且只适用于本次分享。
- 发送到列出分享面板(其他应用、文件、消息)以及每个目标一个选项框。标签页上的角标统计已勾选的目标数量。上次勾选的目标会预先勾选,但本 Session 已经发送过的目标除外:它们初始为未勾选,并显示已上传及日期和勾选以再次上传。对话框打开时,应用会静默检查每个目标;如果服务器表明它会拒绝上传,例如因为密码已更改或分享已被移除,该行会变为红色并显示原因。
取消勾选分享面板后,按钮显示为上传;两者都勾选时显示为分享并上传。一条 snackbar 会确认有多少个 Session 已加入队列。Session 总是先进入队列,然后在后台上传,因此您可以继续工作。
跟踪上传¶
Session 列表中的 Session 卡片会在 Session 标题下方的第一行显示状态:排队中、等待 Wi-Fi、等待网络连接、正在上传…、带日期的已于 … 上传,或一条失败信息。点按该行可查看按目标分列的列表,其中有立即重试和从队列中移除。Session 回顾在应用栏中以云朵图标显示相同状态;点按它会打开同一列表。
失败的上传会以递增的间隔自行重试,最长相隔六小时,最多三十次。失败,将自动重试表示应用会再次尝试。上传失败。请检查目标设置。表示服务器已拒绝,重试无济于事:密码已更改、上传已被关闭,或目标已被移除。请打开该目标,运行测试连接,如果凭据已更改,请移除并重新添加它。
只有当该 Session 曾发送到的目标中至少有一个仍存在于设置中时,该行和图标才会显示。移除目标后它们会消失,因为“已上传”不再是关于您所拥有的任何目标的事实。
后台运行的内容¶
排队的上传会在应用打开期间以及每次回到前台时运行。在 Android 上,它们也会在应用关闭时运行:一旦有合适的网络可用(目标要求时为 Wi-Fi),系统就会启动它们,并持续重试直到队列清空。在 iOS 上,上传会在应用打开期间准备好,然后交给系统;系统会在应用处于后台或已关闭时完成上传,并自行重试。通过未加密 http 访问的目标仍由应用处理,仅在应用打开期间上传。
再次上传 Session¶
再次上传同一个 Session,例如在 Session 回顾中修正检测之后,会把相同的文件名写入相同的文件夹。允许覆盖的服务器会替换该文件;Nextcloud File Drop 则以带编号的名称保留旧副本。无论哪种方式,项目负责人都会得到最新版本,并且不会删除任何内容。
ARU 模式¶
野外部署会产生许多 Session,而且往往在无人看管手机时产生。在某个目标上开启自动上传 ARU Sessions,每个已完成的 ARU Session 都会被加入该目标的队列而不弹出对话框,并使用导出与同步中音频和元数据的默认值。把每个周期保存为独立 Session 的部署会逐周期上传;合并的部署 Session 不会被重复上传。
对于使用移动数据套餐的站点,请保持仅通过 Wi-Fi 上传开启,除非套餐承受得了音频流量;当音频太大无法发送时,可考虑把录音设为仅检测或关闭。此后,只要手机找到合适的网络,上传就会流出,在 Android 上应用处于后台时也是如此。
两个实际示例¶
使用 Nextcloud File Drop 的周末调查¶
负责人在大学的 Nextcloud 中创建一个 Birdathon 2027 文件夹,以带密码的 File Drop 方式分享,把分享链接和密码粘贴到加入页面,为项目命名,并把 QR 码打印在简报表上。二十名志愿者在周六早上扫描它,输入自己的姓名作为参与者标识,通过连接测试并保存。
周日晚上,每位志愿者打开 Session 列表,选中周末的 Session,点按分享,在发送到下保持项目勾选,然后点按上传。上传在家中等待 Wi-Fi 并在夜间完成。周一,负责人看到二十个以上传 ID 命名的文件夹,每个都有几个 ZIP,并从隐藏的注册文件或 JSON 记录中的 meta.participant 字段读取志愿者的姓名。
在 Session 回顾中修正,然后是一个 ARU 站点¶
一位贡献者回顾一个 Session,删除两条误检,手动添加一个物种并保存。Session 回顾应用栏中的云朵图标显示该 Session 已于周六上传。他们点按工具栏中的分享图标,在发送到下勾选项目——它初始为未勾选并显示已上传及日期——然后按下上传。修正后的 ZIP 会替换先前的文件,或在 File Drop 上以带编号的名称存放在其旁边。
同一位贡献者把一部手机留在芦苇荡作为 ARU 站点,小屋里有 Wi-Fi 热点。他们在那部手机上加入项目目标,开启自动上传 ARU Sessions并保持仅通过 Wi-Fi 上传开启。每天早上,已完成的夜间周期会在站点空闲时加入队列并上传;负责人看到新的 ZIP 出现在那部手机的上传 ID 下,无需任何人触碰。
隐私与责任¶
上传目标由项目组织者运营,而非 BirdNET-Team。文件夹、服务器、谁能读取以及数据保留多久,都由组织者自己的隐私和安全规则决定;加入之前请向他们询问详情。BirdNET Live 只写入您选择发送的内容,并把凭据保存在您设备的钥匙串中。
上传包含分享会包含的内容:该 Session 的 JSON 记录,含检测、时间、坐标、观察者姓名和地点名称(如已设置)、设备的上传 ID、您输入的参与者标识以及应用版本;再加上您勾选的音频、表格和报告。发送前请检查内容标签页,当录音可能包含人声或任何您不愿交给项目的内容时,请不要包含音频。您对自己上传的内容负责。请不要上传或分享您认为私密或保密的数据,也不要上传您无权传递的录音。
疑难解答¶
| 消息 | 含义 | 处理方法 |
|---|---|---|
| 这看起来不像链接或服务器地址。 | 文本不是 URL。 | 请粘贴完整的加入链接、分享链接或 https:// 地址。 |
| 服务器拒绝了凭据。对于 Nextcloud 分享,请使用分享密码;对于账户,请使用应用密码而不是登录密码。 | 密码错误或缺失,或分享已被移除。Nextcloud 对已删除的分享也会这样回应。 | 使用分享密码或应用密码;向负责人询问该分享是否仍然存在。 |
| 该地址不是 WebDAV 端点。它可能是分享的网页,而不是分享本身。 | 您粘贴的是文件夹的网页,而不是分享链接或 WebDAV 地址。 | 请粘贴分享链接(…/s/…)或 WebDAV 地址。 |
| 此处不允许上传。请让项目负责人在该分享上允许上传。 | 该分享是只读的。 | 请向负责人索取 File Drop 或上传权限。 |
| 服务器上不存在该文件夹。 | 地址指向不存在的位置,或文件夹已被删除。 | 请与负责人核对地址。 |
| 无法验证服务器证书。不支持自签名证书。 | 自签名或损坏的 TLS。 | 请向负责人索取带有效证书的地址。 |
| 该地址使用未加密的 HTTP。在本地网络之外只接受 https:// 地址。 | 本地网络之外的未加密连接。 | 请使用 https:// 地址。 |
| 等待 Wi-Fi | 目标设为仅 Wi-Fi,而手机正在使用移动网络。 | 等待,或关闭该目标的仅 Wi-Fi 开关。 |
| 失败,将自动重试 | 临时问题,例如连接中断或服务器错误。 | 无需操作;应用会自行重试。立即重试可强制尝试一次。 |
| 上传失败。请检查目标设置。 | 服务器因重试无法解决的原因拒绝。 | 打开该目标,运行测试连接,如果凭据已更改,请移除并重新添加它。 |
| 设备钥匙串中缺少该目标的凭据。请移除该目标后重新添加。 | 钥匙串条目已丢失,例如在恢复到新手机之后。 | 移除该目标并重新添加。 |
另请参阅上传目标设置,以及 Session 列表和 Session 回顾指南。