
我通过FTPS建立连接,虽然它与服务器完美连接,但在传输文件时遇到问题.
出于安全原因,订购应用程序的客户端在使用PROT P时请求在数据连接上恢复TLS会话.
因此,我在服务器上启用了此选项:
正如我所说,我可以连接到服务器,但不能传输文件.
如果我取消激活“使用PROT P时数据连接上所需的TLS会话恢复”框,则传输正常.
我正在寻找一种使用库进行文件传输的方法,但是没有成功,但我知道必须有办法.
我给你相关代码的一部分:
TransferImagenesFTP.ftpClIEnt = new FTPSClIEnt();TransferImagenesFTP.ftpClIEnt.connect(InetAddress.getByname("XXX_XXX_XX_X"),26);TransferImagenesFTP.ftpClIEnt.enterLocalPassiveMode();TransferImagenesFTP.ftpClIEnt.setBufferSize(1024000);TransferImagenesFTP.ftpClIEnt.login("xxxxxx","zzzzzz");TransferImagenesFTP.ftpClIEnt.execPROT("P");TransferImagenesFTP.ftpClIEnt.type(FTP.BINARY_file_TYPE); 我感谢任何帮助,谢谢.
解决方法 您可以尝试以下代码,我希望它也适用于您的情况.该代码使用Apache Commons vsf2通过安全ftp连接(SFTP)上传文件
try { String filepath = "<file PATH>"; String serverAddress = "<FTP SERVER ADDRESS>"; String userID = "<FTP USER ID>"; String password = "<FTP PASSWORD>"; String remoteDirectory = "<FTP DIRECTORY TO UPLOAD TO>"; String keyPath = "<PATH TO YOUR KEY>"; String passphrase = "<PASSWORD FOR YOUR KEY>"; file file = new file(filepath); if (!file.exists()) throw new RuntimeException("Error. file not found"); //Initializes the file manager StandardfileSystemManager manager = new StandardfileSystemManager(); manager.init(); //Setup our SFTP configuration fileSystemOptions opts = new fileSystemOptions(); SftpfileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts,"no"); SftpfileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts,true); SftpfileSystemConfigBuilder.getInstance().setTimeout(opts,10000); // Create local file object fileObject localfile = manager.resolvefile(file.getabsolutePath()); // Create remote file object fileObject remotefile = manager.resolvefile(createConnectionString(serverAddress,userID,password,keyPath,passphrase,fileToFTP),createDefaultoptions(keyPath,passphrase)); // copy local file to sftp server remotefile.copyFrom(localfile,Selectors.SELECT_SELF); System.out.println("file upload successful");}catch (Exception ex) { ex.printstacktrace(); return false;}finally { manager.close();} 您可以在Apache Commons VFS Documentation查看更多信息
编辑
在理解了FTPS背后的逻辑和@ riyaz-ali的帖子并将您的评论中的链接引用到this article之后
Apache FTP客户端存在问题,它不支持TLS会话恢复.您可以修补Apache Commons library的现有实现.
您可以尝试以下代码步骤来使其工作:
>在项目中添加以下修补的类. (此类扩展了Apache commons中给出的补丁中现有的FTPS实现)
import java.io.IOException;import java.lang.reflect.FIEld;import java.lang.reflect.Method;import java.net.socket;import java.util.Locale;import javax.net.ssl.SSLSession;import javax.net.ssl.SSLSessionContext;import javax.net.ssl.SSLSocket;import org.apache.commons.net.ftp.FTPSClIEnt;import com.Google.common.base.Throwables;public class PatchedFTPSClIEnt extends FTPSClIEnt { @OverrIDe protected voID _prepareDataSocket_(final Socket socket) throws IOException { if(socket instanceof SSLSocket) { final SSLSession session = ((SSLSocket) _socket_).getSession(); final SSLSessionContext context = session.getSessionContext(); try { final FIEld sessionHostPortCache = context.getClass().getDeclaredFIEld("sessionHostPortCache"); sessionHostPortCache.setAccessible(true); final Object cache = sessionHostPortCache.get(context); final Method method = cache.getClass().getDeclaredMethod("put",Object.class,Object.class); method.setAccessible(true); final String key = String.format("%s:%s",socket.getInetAddress().getHostname(),String.valueOf(socket.getPort())).tolowerCase(Locale.ROOT); method.invoke(cache,key,session); } catch(Exception e) { throw Throwables.propagate(e); } } }} >使用此修改后的代码段.
TransferImagenesFTP.ftpClIEnt = new PatchedFTPSClIEnt();TransferImagenesFTP.ftpClIEnt.connect(InetAddress.getByname<SERVER-ADDRESS>"),26);TransferImagenesFTP.ftpClIEnt.login("<USERname>","<PASSWORD>");TransferImagenesFTP.ftpClIEnt.execPBSZ(0);TransferImagenesFTP.ftpClIEnt.execPROT("P");TransferImagenesFTP.ftpClIEnt.enterLocalPassiveMode();//Now use the FTP clIEnt to upload the file as usual. 希望这对您有用,并将解决您的问题.
总结以上是内存溢出为你收集整理的java – 使用FTPS将文件从android传输到服务器全部内容,希望文章能够帮你解决java – 使用FTPS将文件从android传输到服务器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)