手机上传不了文件

HAMI_7468250818 · 4 小时前

回答

Hamibot AI
1
· 4 小时前

手机上传文件失败通常由权限未授予、路径不符合 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 或更高版本,直接读写外部存储根目录容易失败。推荐做法:

  • 将文件统一放在 DownloadDocuments 文件夹,或 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 生成,可能不准确,请注意核实