Android Studio中Commons FTPS SFTP上传图片仅生成0KB文件求助
解决FTPSClient上传图片仅生成0KB空文件的问题
我之前也碰到过一模一样的问题,结合你说WinSCP能正常上传、已配置证书的情况,咱们从代码逻辑和FTPSClient的常见坑来一步步排查:
核心问题分析&解决方案
1. 最可能的原因:文件流未正确处理
你的代码片段只写到一半,但大概率是输入流没有被正确读取或关闭,导致FTPSClient只创建了文件壳,没写入实际内容。给你一个完整的正确上传流程参考:
FTPSClient ftpClient = new FTPSClient(false); try { Log.i("chama", NameOfFile); ftpClient.connect(url); ftpClient.login(us, pass); // 被动模式要在登录后、上传前设置,确保数据连接正常建立 ftpClient.enterLocalPassiveMode(); // 重中之重:上传图片必须设置二进制文件类型! // 默认ASCII模式会损坏二进制文件,甚至直接生成空文件 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 打开本地图片的输入流 File localImage = new File(你的本地图片路径); FileInputStream inputStream = new FileInputStream(localImage); // 执行上传:第一个参数是服务器上的文件名,第二个是本地输入流 boolean uploadSuccess = ftpClient.storeFile(remoteFileName, inputStream); if (uploadSuccess) { Log.i("chama", "图片上传成功!"); } else { // 打印服务器返回的错误信息,精准定位问题 Log.e("chama", "上传失败,服务器回复:" + ftpClient.getReplyString()); } // 必须关闭输入流,否则可能导致资源泄漏或文件未完全写入 inputStream.close(); // 用完记得登出、断开连接,避免占用服务器资源 ftpClient.logout(); ftpClient.disconnect(); } catch (IOException e) { Log.e("chama", "上传过程异常", e); // 异常时要确保断开连接,防止资源占用 if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ex) { ex.printStackTrace(); } } }
2. 容易忽略的细节:二进制文件类型设置
这是FTPS上传图片、压缩包等二进制文件的必做步骤!WinSCP会自动识别文件类型并适配,但FTPSClient默认是ASCII模式,这种模式下上传图片会导致内容被错误转换,最终要么是空文件,要么是损坏的文件。一定要加上这行代码:
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
3. 证书验证的隐性问题
你说已经添加了证书,但FTPSClient可能没有正确信任该证书。可以先临时关闭证书验证(仅用于测试,生产环境不建议)来排查:
ftpClient.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
如果关闭后能正常上传,说明你的证书配置有问题,需要检查证书格式是否正确、是否被App的信任库正确加载。
4. 被动模式的时机问题
确保enterLocalPassiveMode()是在login()之后、上传操作之前调用的,有些FTPS服务器对被动模式的启用时机有严格要求,顺序不对会导致数据连接无法建立,进而无法写入文件内容。
额外排查小技巧
- 打印服务器返回信息:在登录、上传前后调用
ftpClient.getReplyString(),查看具体的错误码和提示,这能帮你快速定位问题。 - 检查本地文件权限:Android 6.0及以上版本需要动态申请存储读取权限,确保你的App已经获得了读取该图片文件的权限,否则输入流会读取失败,最终生成空文件。
内容的提问来源于stack exchange,提问作者Chama
相关产品推荐
相关产品推荐

