You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用升级targetSdkVersion至28后,5.0/6.0设备FTP上传异常求助

解决targetSdkVersion升级到28后Android 5.0/6.0上FTP上传变慢/停滞的问题

我来帮你搞定这个FTP上传的坑!targetSdkVersion从26升到28后在低版本Android设备上出现的上传问题,主要和FTP被动模式缺失以及targetSdk28引入的明文网络限制有关,结合你的代码,给你一步步的解决方案:

核心原因分析

  1. FTP模式问题:你的代码里没有启用被动模式(PASV),FTP默认的主动模式需要服务器主动连接客户端的端口,现在移动网络和防火墙大多会拦截这种入站连接,导致数据传输卡住甚至上传0KB。
  2. 明文网络限制:targetSdk28及以上默认禁用明文网络通信(FTP属于明文协议),虽然Android 5/6本身没强制这个规则,但当应用targetSdk升到28后,系统会应用更严格的网络安全策略,间接影响低版本设备的网络行为。

具体解决方案

1. 启用FTP被动模式

这是最关键的一步,直接解决连接阻塞问题。在登录FTP服务器后添加被动模式的配置:

client.login(ftpUserName, ftpPassword);
client.enterLocalPassiveMode(); // 新增这行,启用被动模式
client.setFileType(FTPClient.BINARY_FILE_TYPE);

被动模式会让客户端主动连接服务器开放的端口,避开防火墙的拦截,确保数据能正常传输。

2. 配置网络安全策略允许明文FTP

因为targetSdk28默认禁止明文网络,需要明确允许和你的FTP服务器的明文通信:

  • 在res/xml目录下创建network_security_config.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <!-- 替换成你的FTP服务器域名或IP -->
        <domain includeSubdomains="true">your-ftp-host.com</domain>
    </domain-config>
</network-security-config>
  • 在AndroidManifest.xml的application标签中添加引用:
<application
    ...
    android:networkSecurityConfig="@xml/network_security_config">
    ...
</application>

3. 优化代码的资源管理与错误处理

你的代码存在资源泄漏风险,且没有检查上传结果,优化后能更精准定位问题:

boolean status = false;
FTPClient client = new FTPClient();
try {
    client.connect(FTP_HOST, 21);
    // 检查登录是否成功
    if (!client.login(ftpUserName, ftpPassword)) {
        throw new IOException("FTP登录失败,请检查账号密码");
    }
    client.enterLocalPassiveMode();
    client.setFileType(FTPClient.BINARY_FILE_TYPE);
    // 检查目录切换是否成功
    boolean isDirChanged = client.changeWorkingDirectory(ftpDirectory + "/");
    if (!isDirChanged) {
        throw new IOException("无法切换到目标目录:" + ftpDirectory);
    }
    for (String filePath : fileNameList) {
        File file = new File(filePath);
        // 使用try-with-resources自动关闭流,避免资源泄漏
        try (FileInputStream in = new FileInputStream(file)) {
            boolean isUploaded = client.storeFile(file.getName(), in);
            // 检查单文件上传是否成功
            if (!isUploaded) {
                throw new IOException("文件上传失败:" + file.getName());
            }
        }
    }
    status = true;
} catch (Exception e) {
    e.printStackTrace();
} finally {
    // 统一在finally中释放资源,确保连接关闭
    try {
        if (client.isConnected()) {
            client.logout();
            client.disconnect();
        }
    } catch (Exception e2) {
        e2.printStackTrace();
    }
}

4. 检查FTP服务器配置

如果以上步骤还没解决问题,建议联系FTP服务器管理员确认:

  • 服务器是否开启了被动模式(PASV)
  • 被动模式的端口范围是否在防火墙/安全组中开放

总结

先启用被动模式,再配置网络安全允许明文通信,最后优化代码的错误处理,这三个步骤基本能解决你在Android 5.0/6.0设备上的FTP上传问题。

内容的提问来源于stack exchange,提问作者Sinem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:38:10