ftp上传文件代码以及目录编码方式
if (FTPReply.isPositiveCompletion(
ftpClient.sendCommand("OPTS UTF8", "ON"))
) {
LOCAL_CHARSET = "UTF-8";
}这段代码是用于判断FTP服务器是否支持UTF-8编码。
ftpClient.sendCommand("OPTS UTF8", "ON")
发送了一个FTP命令"OPTS UTF8"
,并传递参数"ON"
,用于启用UTF-8编码模式。如果服务器支持并成功执行该命令,返回的响应码应该是 200 或者 250。
FTPReply.isPositiveCompletion
是FTPReply类中的一个静态方法,用于检查FTP服务器响应码是否表示成功完成。如果响应码是正常的完成码(2xx),例如 200 或者 250,那么isPositiveCompletion
方法将返回 true。因此,
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON")))
这个条件语句将判断FTP服务器是否支持UTF-8编码,如果返回值为 true,表示服务器支持,并且可以在之后的文件传输中使用UTF-8编码模式。在FTP协议中,客户端和服务器之间的通信使用的是ASCII编码。但是,有些文件名或文件内容可能使用的是非ASCII字符集,例如UTF-8或GBK等。如果客户端和服务器之间使用的编码方式不同,则可能会导致文件名或文件内容在传输过程中出现乱码。 为了解决这个问题,FTP协议支持使用OPTS命令来设置客户端和服务器之间的编码方式。
ftpClient = FtpTest.getFTPClient(ftpHost, ftpPort, ftpUserName,
ftpPassword);
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(
"OPTS UTF8", "ON"))) { //$NON-NLS-1$ //$NON-NLS-2$
LOCAL_CHARSET = "UTF-8"; //$NON-NLS-1$
}
ftpClient.setControlEncoding(LOCAL_CHARSET);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpPath = new String(ftpPath.getBytes(LOCAL_CHARSET), "iso-8859-1"); //$NON-NLS-1$
String remoteFileName = ftpPath;
ftp下载文件根据 上传的编码方式下载
List<PmTaskDoc> docList = []
JSONArray docArray = new JSONArray()
FTPClient ftpClient = new FTPClient();
//连接FTP服务器
//ftpClient.setControlEncoding("utf8");
ftpClient.connect(FtpFileStorage.ftpIP, Integer.parseInt(FtpFileStorage.ftpPort));
//登录FTP服务器
ftpClient.login(FtpFileStorage.ftpUser, FtpFileStorage.ftpPassword);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
//this.ftp.setControlEncoding("GBK");
String LOCAL_CHARSET = "GBK";
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
System.out.println("FTP OPTS UTF8 is ON");
LOCAL_CHARSET = "UTF-8";
}
fileDatas.each { FileData fileData ->
SysFile sysFile
if (fileData.fileByte == null){
String fullpath = fileData.filename;
String[] parts = fullpath.split("/"); // 使用斜杠(/)为分隔符将路径拆分成多个部分
parts = Arrays.copyOfRange(parts, 1, parts.length);
String lastDirectoryName = parts[parts.length - 1];
FTPFile[] fs
for (int i =0;i<parts.length;i++){
byte[] encoded = parts[i].getBytes(LOCAL_CHARSET);
parts[i] = new String(encoded, "iso-8859-1")
if (!ftpClient.getReplyCode()){
break
}
if (i == parts.length-1){
String name = parts[i]
InputStream inputStream =ftpClient.retrieveFileStream(name);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, bytesRead);
}
byte[] byteArray = byteArrayOutputStream.toByteArray();
ByteBuffer byteBuffer = ByteBuffer.allocate(byteArray.length);
byteBuffer.put(byteArray);
inputStream.close();
byteArrayOutputStream.close();
sysFile = FileStorageFactory.getStorage("local").upload(byteArray, lastDirectoryName)
break
}
if (!ftpClient.changeWorkingDirectory(parts[i])) {
throw new MajorException(String.format('thrift调用writeTestFile接口上传附件:使用ftp长传附件时切换目录失败%s',fileData.filename))
}
}
}
}
ftpClient.logout();
ftpClient.disconnect();