suzf178 2022-04-13 15:10 采纳率: 100%
浏览 24
已结题

android从ftp下载图片到sd卡中,图片中存储的数据丢失,如何解决?

问题遇到的现象和发生背景

安卓下载ftp服务器中的jpg图片,下完完成之后,保存在图片中的数据丢失了一部分

问题相关代码,请勿粘贴截图
//ftp连接代码
public FTPClient getFTPClient(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword) {
        if (ftpClient == null) {
            ftpClient = new FTPClient();
        }
        if (ftpClient.isConnected()) {
            return ftpClient;
        }
        Log.e(TAG, "ftpHost:" + ftpHost + ",ftpPort:" + ftpPort);
        
        try {
            // 设置超时时间
            ftpClient.setConnectTimeout(50000);
            // 设置中文编码集,防止中文乱码
            ftpClient.setControlEncoding("GBK");
            //连接服务器
            ftpClient.connect(ftpHost, ftpPort);
            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                Log.e(TAG, "connect fail: replyCode:" + replyCode);
                return ftpClient;
            }
            Log.e(TAG, "connect success: replyCode" + replyCode);
            //登录
            Log.e(TAG, "ftpUserName:" + ftpUserName + ",ftpPassword:" + ftpPassword);
            ftpClient.login(ftpUserName, ftpPassword);
            int replyCode1 = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode1)) {
                ftpClient.disconnect();
                Log.e(TAG, "login fail: replyCode:" + replyCode1);
                return ftpClient;
            }
            Log.e(TAG, "login success: replyCode:" + replyCode);
            //使用被动模式
            ftpClient.enterLocalPassiveMode();
            //二进制文件支持
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);
        } catch (IOException e) {
            e.printStackTrace();
            Log.e(TAG, e.getMessage());
            return null;
        }
        return ftpClient;
    }



//文件下载代码
private void downLoadFile(String name){
        //下载文件
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                // 默认失败
                boolean flag = false;
                try {
                    //使用被动模式
                    ftpClient.enterLocalPassiveMode();
                    // 跳转到文件目录
                    ftpClient.changeWorkingDirectory(ftpFileNow);
                    // 获取目录下文件集合
                    FTPFile[] files = ftpClient.listFiles();
                    for (FTPFile file : files) {
                        // 取得指定文件并下载
                        if (file.getName().equals(name)) {
                            Log.e("fileName:", name);
                            File downFile = new File(createNew.getPath() + File.separator + file.getName());
                            if (downFile.exists()){
                                downFile.delete();
                                downFile.createNewFile();
                            }
                            OutputStream fos = null;
                            try {
                                fos = new FileOutputStream(downFile);
                                flag = ftpClient.retrieveFile(new String(file.getName().getBytes(),StandardCharsets.ISO_8859_1), fos);
                                fos.flush();
                                if (flag){
                                    showToast("下载成功");
                                    downLoadFilePath = createNew.getPath();
                                }else {
                                    showToast("下载失败");
                                }
                                fos.close();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

2条回答 默认 最新

  • suzf178 2022-04-15 08:49
    关注

    应该是我用的android studio模拟器连接ftp服务器的问题,用真机调试没有出过这个现象

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月23日
  • 已采纳回答 4月15日
  • 创建了问题 4月13日

悬赏问题

  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题