Java调用FTP上传下载文件损坏

KingSen_Yale 2019-12-10 05:43:36
项目中,用到了FTP进行上传下载,现在出现了问题:
项目是Spring-boot项目,项目部署在windows环境下,能正常上传下载,没任何问题,
但是当项目部署在Linux服务器上时,出现如下问题:
1)word文件能下载,打不开(Excel、Jar文件能正常下载)
2)jpg文件下载下载直接是txt文件,根本不是jpg格式
3)对pdf下载时,能正常下载,但是文件损坏,文件变色,如图
上传下载的工具代码是博客里直接找的,楼下我贴出来,好几天了,仍然找不出什么原因,
大家是否遇到过此问题,麻烦给点经验



...全文
504 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
KingSen_Yale 2019-12-10
  • 打赏
  • 举报
回复
这是上传方法



    /**
     *
     * 功能:上传文件附件到文件服务器
     * @param request:上传文件流
     * @return
     * @throws IOException
     */
    public static boolean upload(MultipartFile uploadFile, HttpServletRequest request, long id) {
        boolean result = false;
        try {
            request.setCharacterEncoding("utf-8");
            ftpClient.connect("ip", 21);
            ftpClient.login("账号", "密码");
            ftpClient.enterLocalPassiveMode();
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            mkDir("uploadFiles");// 创建目录
            // 设置上传目录 must
            ftpClient.changeWorkingDirectory("/" + "uploadFiles");
            if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
                LOCAL_CHARSET = "UTF-8";
            }
            String fileName = new String(uploadFile.getOriginalFilename().getBytes(LOCAL_CHARSET), SERVER_CHARSET);
            fileName = id + "_" + fileName;// 构建上传到服务器上的文件名 20-文件名.后缀
            FTPFile[] fs = ftpClient.listFiles(fileName);
            if (fs.length == 0) {
                System.out.println("this file not exist ftp");
            } else if (fs.length == 1) {
                System.out.println("this file exist ftp");
                ftpClient.deleteFile(fs[0].getName());
            }
            InputStream is = uploadFile.getInputStream();
            result = ftpClient.storeFile(fileName, is);
            is.close();
        } catch (IOException e) {
            result = false;
            e.printStackTrace();
        } finally {
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

KingSen_Yale 2019-12-10
  • 打赏
  • 举报
回复
这是下载方法


public static void downFileByte(String fileName,HttpServletResponse resp) throws Exception {
        ftpClient.connect("IP", 21);
        ftpClient.login("账号", "密码");
        ftpClient.enterLocalPassiveMode();
        String remotePath="uploadFiles";
        if(remotePath!=null && !remotePath.equals("")){
            ftpClient.changeWorkingDirectory(remotePath);
        }
        BufferedOutputStream os = null;
        byte[] return_arraybyte = null;
        InputStream ins = null;
        if (ftpClient != null) {
            byte[] buffer = new byte[1024];
            int byteread;
            try {
                //JAR源码存在问题,获取目录所在的文件会缺少部分,只能获取文件名称
                String [] files= ftpClient.listNames();
                for (String file : files) {
                    String f=new String(file.getBytes("ISO-8859-1"),"utf-8");//防止乱码
                    if (f.equals(fileName)) {
                        //需使用file.getName获值,若用f会乱码
                        ins = ftpClient.retrieveFileStream(file);
                        resp.reset();
                        resp.addHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(f, "utf-8"));
                        resp.setContentType("application/octet-stream");
                        os = new BufferedOutputStream(resp.getOutputStream());
                        while((byteread = ins.read(buffer)) != -1) {
                            os.write(buffer, 0, byteread);
                        }
                        ins.close();
                        os.flush();
                        os.close();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                closeConnect();
                try {
                    if (ins != null) {
                        ins.close();
                    }
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                try {
                    if (os != null) {
                        os.close();
                    }
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }










一套功能强大,可取代记事本的文字编辑器,拥有无限制的 Undo/Redo、英文拼字检查、自动换行、列数标记、搜寻取代、同时编辑多文件、全屏幕浏览功能。而它还有一个好用的功能,就是它有监视剪贴簿的功能,能够同步于剪贴簿自动将文字贴进 EditPlus 的编辑窗口中,让你省去做贴上的步骤。另外它也是一个好用的 HTML 编辑器,除了可以颜色标记 HTML Tag (同时支持 C/C++、Perl、Java) 外,还内建完整的 HTML 和 CSS1 指令功能,对于习惯用记事本编辑网页的朋友,它可帮你节省一半以上的网页制作时间,若你有安装 IE 3.0 以上版本,它还会结合 IE 浏览器于 EditPlus 窗口中,让你可以直接预览编辑好的网页 (若没安装 IE,也可指定浏览器路径)。 EditPlus 3.31.1129 (2011-11-17) 更新未知 EditPlus 3.31.976 (2011-09-21) 更新未知 EditPlus 3.31.860 (2011-08-08) <功能> * 默认支持 Python/Ruby on Rails 语法加亮 * 改进语法加亮速度 (长行) *“未修改文档禁用保存按钮”选项 (“参数设置”-“文件”) * 在分隔命令中显示制表符和空格 * 在文件中查找允许以“;”号间隔的多文件夹名称 * 增加工具组数量到 20 个 * 在 #PREFIX 和 #SUFFIX 声明中允许字符串值 *“设置重复行标记”命令 (“编辑 - >“其它”) *“监视日志文件”命令 (“文件”) * -pi 命令行选项指定了不同的工程配置文件 * 字符串插入支持 Perl 语法加亮 * 单词 (文字) 加亮现在支持选择不同的单词 (文字) * 新增“恢复默认值”按钮 (在字体对话框) * 在颜色拾取器显示颜色代码 * 添加“使用 STAT 代替 LIST”FTP 选项 * 添加“运行为文本过滤器 (替换固定光标)”用户工作操作 * 添加“包含用户帐号名称”备份选项 * 新增“尝试键盘交互验证”SFTP 选项 * 新增 256x256 尺寸应用程序图标 <错误修正> * 特别长的行会导致程序崩溃 * 如果在十六进制查看器模式打开文件出错, 可能导致程序崩溃 * 修正资源管理器右键按钮可能冻结的问题 * PHP 语法加亮会导致块注释内容损坏 * 另存为对话框会返回不正确的带长文件名的文件扩展名 * 远程文件备份文件扩展选项不工作 *“监视剪贴板”功能会多次粘贴相同的文本 * '设置目录' 对话框的 '导入/导出' 按钮不起作用 * 如果默认编码选项设置为 Unicode, 则模板不能工作 * 当切换文档时,函数列表没有更新 * 如果手动添加路径, 可能无法执行 php.exe * 修正编辑语法文件时的光标位置错误的问题 * 用户工具菜单位图无法显示自定义图标 * 在 '隐藏行号' 选项的打印页面工作不正常 * 在目录窗口的 '在浏览器查看' 可能错误地运行 '源视图编辑' 命令 * 加亮文字选项会导致程序冻结 * 修正自定义快捷列表“目录”->“刷新”丢失的问题 * 修正 Windows 经典主题菜单位图问题 * “工具”对话框会显示错误的浏览器名称列表 * 查找上一个时, “继续到下一个”选项不能工作 * 自定义文件类型无法设置缩进值为 1 * “在文件中查找”击键记录可能不正确 * 修正全屏模式下输出窗口位置错误的问题 * 在 Windows XP 下“在 Internet Explorer 中使用 EditPlus”选项不工作 * 阻止错误的“文件被修改”警告信息 关于简体中文版 ========== * 修正:'工具'->'设置目录' 的按钮排列问题。感谢 hdzz [0504] * 修正:汉化了几个以前不能动的单词(比如 Text 和 Default)而不会导致软件BUG [0503] * 修正:当另存为时,在文件名称输入框的鼠标右键菜单问题 [0501] (完美解决方案,真正中文,不会再调出来韩文了。感谢 D4llower 等多位网友协力帮助) * 修正:在 64 位系统下,无法设置系统右键快捷菜单关联 [0501] * 修正: 当 "另存为"、并在文件名称输入框点击鼠标右键时, 弹出英文菜单的问题 (详见下) [0427] * 修正: 参数设置素材目录一处翻译错误 [0315] * 修正: '首选项'->'常规' 的 '使用 TR1 正则表达式' 选项显示位置不正确的问题 [1014] * 修正: FTP 设置对话框布局的问题 [0907] * 修正: 不能定义颜色的问题 [0828] * 更新: 许可协议汉化 [0612] * 修正: “文档”菜单中的“文件多编码方式”根据意译修改为“批量更改文件编码”,感谢 liuyan814 [0610] * 修正: 字符统计功能不准确的问题,感谢 liuyan814 [0610] * 新增: Liangjh 的 Tips.txt 文件,感谢 Liangjh * 新增: python 语法着色模板 关于“另存为”右键菜单问题的重要说明 EditPlus 3.21.761 之后的版本,与之前的版本在程序设计上有较大的改变!按照之前的汉化和解决方法,已经不能完美解决问题!比如使用新版本打开一个文本文件,当“另存为”、并在文件名输入框里点鼠标右键时,右键菜单为英文。好多网友反反馈认为没有汉化完整,其实这和汉化完全无关,该资源根本不在 EditPlus 所附带的任何一个文件里。原因是主程序调用系统资源文件 comctl32.dll 的方式改变了,英文版只读取英文资源(基于英文版的汉化版当然也一样)。经过反复模索和试验,终于找到了解决办法!-- [0501] 以后的版本均采用此完美解决方法。 注册信息:kariryo 5387D-12450-BCZ8B-D6W0B-85TE1
项目中使用的技术: 1、前端:jsp、css、javascript、jQuery(js框架)、jquery.form.js、HTML富文本编辑器、        My97时间控件(添加员工)2、后台:Struts2、动态代理、Mybatis框架、log4J日志框架、jstl 、jstl自定义分页标签、代码机器人、Dwr、POI(实现Excel文件的导入导出)等3、数据库:Mysql4、服务器:Tomcat项目中涉及的功能: 1、项目以及数据库搭建2、用户异步登录、退出3、拦截器功能实现以及整合动态代理4、公告模块的增加、修改、删除、查询以及预览功能实现、文件异步上传5、文档模块的增加、修改、删除、查询以及文档的上传下载6、员工信息的增加、修改、删除、查询以及员工头像异步上传、员工信息导出至Excel文件7、自定义分页标签实现(24种样式随意切换)8、代码机器人使用等等其他实战项目:java项目实战之电商系统全套(前台和后台)(java毕业设计ssm框架项目)https://edu.csdn.net/course/detail/25771 java项目之oa办公管理系统(java毕业设计)https://edu.csdn.net/course/detail/23008 java项目之hrm人事管理项目(java毕业设计)https://edu.csdn.net/course/detail/23007 JavaWeb项目实战之点餐系统前台https://edu.csdn.net/course/detail/20543 JavaWeb项目实战之点餐系统后台https://edu.csdn.net/course/detail/19572 JavaWeb项目实战之宿舍管理系统(Java毕业设计含源码)https://edu.csdn.net/course/detail/26721 JavaWeb项目实战之点餐系统全套(前台和后台)https://edu.csdn.net/course/detail/20610 java项目实战之电子商城后台(java毕业设计SSM框架项目)https://edu.csdn.net/course/detail/25770 java美妆商城项目|在线购书系统(java毕业设计项目ssm版)https://edu.csdn.net/course/detail/23989 系统学习课程:JavaSE基础全套视频(环境搭建 面向对象 正则表达式 IO流 多线程 网络编程 java10https://edu.csdn.net/course/detail/26941 Java Web从入门到电商项目实战挑战万元高薪(javaweb教程)https://edu.csdn.net/course/detail/25976其他素材版(毕业设计或课程设计)项目:点击老师头像进行相关课程学习
软件大小:1.44 MB 软件语言:简体中文 软件作者:EditPlus 运行环境:/Win9X/Me/WinNT/2000/XP/Win2003/Vista 软件介绍 一套功能强大,可取代记事本的文字编辑器,拥有无限制的 Undo/Redo、英文拼字检查、自动换行、列数标记、搜寻取代、同时编辑多文件、全屏幕浏览功能。而它还有一个好用的功能,就是它有监视剪贴簿的功能,能够同步于剪贴簿自动将文字贴进 EditPlus 的编辑窗口中,让你省去做贴上的步骤。另外它也是一个好用的 HTML 编辑器,除了可以颜色标记 HTML Tag (同时支持 C/C++、Perl、Java) 外,还内建完整的 HTML 和 CSS1 指令功能,对于习惯用记事本编辑网页的朋友,它可帮你节省一半以上的网页制作时间,若你有安装 IE 3.0 以上版本,它还会结合 IE 浏览器于 EditPlus 窗口中,让你可以直接预览编辑好的网页 (若没安装 IE,也可指定浏览器路径)。 EditPlus 3.31.860 (2011-08-08) <功能> * 默认支持 Python/Ruby on Rails 语法加亮 * 改进语法加亮速度 (长行) *“未修改文档禁用保存按钮”选项 (“参数设置”-“文件”) * 在分隔命令中显示制表符和空格 * 在文件中查找允许以“;”号间隔的多文件夹名称 * 增加工具组数量到 20 个 * 在 #PREFIX 和 #SUFFIX 声明中允许字符串值 *“设置重复行标记”命令 (“编辑 - >“其它”) *“监视日志文件”命令 (“文件”) * -pi 命令行选项指定了不同的工程配置文件 * 字符串插入支持 Perl 语法加亮 * 单词 (文字) 加亮现在支持选择不同的单词 (文字) * 新增“恢复默认值”按钮 (在字体对话框) * 在颜色拾取器显示颜色代码 * 添加“使用 STAT 代替 LIST”FTP 选项 * 添加“运行为文本过滤器 (替换固定光标)”用户工作操作 * 添加“包含用户帐号名称”备份选项 * 新增“尝试键盘交互验证”SFTP 选项 * 新增 256x256 尺寸应用程序图标 <错误修正> * 特别长的行会导致程序崩溃 * 如果在十六进制查看器模式打开文件出错, 可能导致程序崩溃 * 修正资源管理器右键按钮可能冻结的问题 * PHP 语法加亮会导致块注释内容损坏 * 另存为对话框会返回不正确的带长文件名的文件扩展名 * 远程文件备份文件扩展选项不工作 *“监视剪贴板”功能会多次粘贴相同的文本 * '设置目录' 对话框的 '导入/导出' 按钮不起作用 * 如果默认编码选项设置为 Unicode, 则模板不能工作 * 当切换文档时,函数列表没有更新 * 如果手动添加路径, 可能无法执行 php.exe * 修正编辑语法文件时的光标位置错误的问题 * 用户工具菜单位图无法显示自定义图标 * 在 '隐藏行号' 选项的打印页面工作不正常 * 在目录窗口的 '在浏览器查看' 可能错误地运行 '源视图编辑' 命令 * 加亮文字选项会导致程序冻结 * 修正自定义快捷列表“目录”->“刷新”丢失的问题 * 修正 Windows 经典主题菜单位图问题 * “工具”对话框会显示错误的浏览器名称列表 * 查找上一个时, “继续到下一个”选项不能工作 * 自定义文件类型无法设置缩进值为 1 * “在文件中查找”击键记录可能不正确 * 修正全屏模式下输出窗口位置错误的问题 * 在 Windows XP 下“在 Internet Explorer 中使用 EditPlus”选项不工作 * 阻止错误的“文件被修改”警告信息 关于简体中文版 ========== * 修正:'工具'->'设置目录' 的按钮排列问题。感谢 hdzz [0504] * 修正:汉化了几个以前不能动的单词(比如 Text 和 Default)而不会导致软件BUG [0503] * 修正:当另存为时,在文件名称输入框的鼠标右键菜单问题 [0501] (完美解决方案,真正中文,不会再调出来韩文了。感谢 D4llower 等多位网友协力帮助) * 修正:在 64 位系统下,无法设置系统右键快捷菜单关联 [0501] * 修正: 当 "另存为"、并在文件名称输入框点击鼠标右键时, 弹出英文菜单的问题 (详见下) [0427] * 修正: 参数设置素材目录一处翻译错误 [0315] * 修正: '首选项'->'常规' 的 '使用 TR1 正则表达式' 选项显示位置不正确的问题 [1014] * 修正: FTP 设置对话框布局的问题 [0907] * 修正: 不能定义颜色的问题 [0828] * 更新: 许可协议汉化 [0612] * 修正: “文档”菜单中的“文件多编码方式”根据意译修改为“批量更改文件编码”,感谢 liuyan814 [0610] * 修正: 字符统计功能不准确的问题,感谢 liuyan814 [0610] * 新增: Liangjh 的 Tips.txt 文件,感谢 Liangjh * 新增: python 语法着色模板 关于“另存为”右键菜单问题的重要说明 EditPlus 3.21.761 之后的版本,与之前的版本在程序设计上有较大的改变!按照之前的汉化和解决方法,已经不能完美解决问题!比如使用新版本打开一个文本文件,当“另存为”、并在文件名输入框里点鼠标右键时,右键菜单为英文。好多网友反反馈认为没有汉化完整,其实这和汉化完全无关,该资源根本不在 EditPlus 所附带的任何一个文件里。原因是主程序调用系统资源文件 comctl32.dll 的方式改变了,英文版只读取英文资源(基于英文版的汉化版当然也一样)。经过反复模索和试验,终于找到了解决办法!-- [0501] 以后的版本均采用此完美解决方法。

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧