回答
手机上传文件失败通常由权限未授予、路径不符合 Android 规范或 http.postMultipart 参数格式错误引起。你可以按以下步骤逐一排查并修复:
1. 授予 Hamibot 存储权限
Hamibot 必须获得系统文件读取权限才能访问本地文件。
- 前往手机 设置 > 应用管理 > Hamibot > 权限,开启 「文件和媒体」 或 「存储」 权限。
- Android 11 及以上设备,建议在权限设置中开启 「允许管理所有文件」,否则访问
/storage/emulated/0/会被系统拦截。
2. 验证文件路径与存在性
Android 对文件路径限制严格,上传前必须确认文件真实存在。建议使用绝对路径或脚本同级目录:
// 文档地址 https://docs.hamibot.com/
var filePath = '/storage/emulated/0/Download/1.txt';
if (!files.exists(filePath)) {
log('文件不存在,请检查路径: ' + filePath);
exit();
}
log('文件已找到,准备上传');
3. 正确使用 http.postMultipart
上传文件必须使用 http.postMultipart,文件字段的值必须是数组格式:['文件名', 'MIME类型', '绝对路径']。附带普通参数时直接写在同一对象中即可。
// 文档地址 https://docs.hamibot.com/
var url = 'https://your-api.com/upload';
var filePath = '/storage/emulated/0/Download/1.txt';
if (!files.exists(filePath)) {
log('文件不存在,终止上传');
exit();
}
try {
var res = http.postMultipart(url, {
file: ['1.txt', 'text/plain', filePath],
appId: 'abcdefghijk'
});
if (res.statusCode === 200) {
log('上传成功: ' + res.body.string());
} else {
log('上传失败,HTTP状态码: ' + res.statusCode);
log('服务端返回: ' + res.body.string());
}
} catch (e) {
log('请求异常: ' + e);
}
4. Android 11+ 分区存储适配建议
如果手机系统为 Android 11 或更高版本,直接读写外部存储根目录容易失败。推荐做法:
- 将文件统一放在
Download、Documents文件夹,或 Hamibot 脚本所在目录。 - 使用
files.cwd()获取当前脚本目录,避免硬编码路径:
// 文档地址 https://docs.hamibot.com/
var safePath = files.cwd() + '/1.txt';
5. 常见失败原因对照
| 现象 | 可能原因 | 解决方式 |
|---|---|---|
files.exists() 返回 false |
路径错误、文件未生成、权限未开 | 检查路径拼写,授予存储权限,使用 Download 目录 |
状态码 400/415 |
服务端不接受 multipart/form-data 或字段名不匹配 |
确认接口文档要求的字段名(如 file 是否需改为 upload) |
状态码 403/500 |
服务端鉴权失败或文件过大 | 检查 Token/签名,压缩文件或分片上传 |
抛出 Permission denied |
Android 系统拦截外部存储访问 | 开启「所有文件访问权限」,或改用 files.cwd() 路径 |
按上述步骤调整后,绝大多数上传问题均可解决。如果仍失败,请提供完整的 log 输出或 HTTP 状态码,我会帮你进一步定位。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实