赞
踩
正常情况下,我们都是把上传的文件保存到Java服务运行的服务器上。前段时间根据公司正式环境上的情况,必须要把文件做成跨服务器存储,经过考虑,最终采用FTP工具存储文件。
因为保存的文件并不是客户使用的文件,而是给运维人员使用的,所以这里并不需要考虑太多,直接写个简单的功能实现就好了。
FTP服务站点怎么建,网上很多教程,不做赘述。本文只记录碰到的坑。
我是在window下开发,FTP服务端是window操作系统,开发阶段测试也在window下debug进行,正式环境下Java服务运行在linux上,采用docker部署。
在开发时一切正常,可是部署到服务器上,没有报出任何异常,但是ftp.storeFile()返回false。
查阅不少资料,很多人找不到jar包,甚至到网上求博主私信jar包,我不太理解为什么找不到,这里直接maven引入依赖就行了。
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
/** * @param url 服务器IP地址 * @param port 服务器端口 * @param userName 用户登录名 * @param password 用户登录密码 * @param storePath 服务器文件存储路径 * @param fileName 服务器文件存储名称 * @param is 文件输入流 * @return true上传成功 false上传失败 */ public static boolean storeFile(String url, int port, String userName, String password, String storePath, String fileName, InputStream is) { boolean result = false; FTPClient ftp = new FTPClient(); try { ftp.connect(url, port);// 连接至服务器,端口默认为21时,可直接通过URL连接 ftp.login(userName, password);// 登录服务器 // 判断返回码是否合法 if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { ftp.disconnect();// 不合法时断开连接 return result;// 结束程序 } ftp.setControlEncoding("UTF-8"); // 中文转码 ftp.enterLocalPassiveMode();// 被动模式 ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);//设置传输方式为流方式 ftp.changeWorkingDirectory(storePath); // 设置文件操作目录 ftp.setFileType(FTPClient.BINARY_FILE_TYPE);// 设置文件类型,二进制 ftp.setBufferSize(3072); // 设置缓冲区大小 fileName = new String(fileName.getBytes("GBK"), "iso-8859-1");//文件名中文报错问题 result = ftp.storeFile(fileName, is);//上传文件 is.close(); ftp.logout();// 登出服务器 } catch (IOException e) { e.printStackTrace(); } finally { try { if (null != is) { is.close(); } if (ftp.isConnected()) { ftp.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return result; }
重点在下面这两句:
ftp.enterLocalPassiveMode();// 被动模式
ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);//设置传输方式为流方式
MultipartFile file = ((MultipartHttpServletRequest) request).getFile("file");
if (!file.isEmpty()) {
try {
InputStream inputStream = file.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
boolean res = FTPUtils.storeFile("127.0.0.1", "21", userName, password, "//", file.getOriginalFilename(), inputStream);
if (!res) {
msg = "FTP发生异常---->>>>文件上传失败";
return new ResponseDto<>(RespCode.ERROR.getId(), msg, null);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。