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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:55:58