Android应用升级targetSdkVersion至28后,5.0/6.0设备FTP上传异常求助
解决targetSdkVersion升级到28后Android 5.0/6.0上FTP上传变慢/停滞的问题
我来帮你搞定这个FTP上传的坑!targetSdkVersion从26升到28后在低版本Android设备上出现的上传问题,主要和FTP被动模式缺失以及targetSdk28引入的明文网络限制有关,结合你的代码,给你一步步的解决方案:
核心原因分析
- FTP模式问题:你的代码里没有启用被动模式(PASV),FTP默认的主动模式需要服务器主动连接客户端的端口,现在移动网络和防火墙大多会拦截这种入站连接,导致数据传输卡住甚至上传0KB。
- 明文网络限制: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
相关产品推荐
相关产品推荐

