java – 使用FTPS将文件从android传输到服务器

java – 使用FTPS将文件从android传输到服务器,第1张

概述我在我的 Android应用程序中使用 Apache Commons FTP library 我通过FTPS建立连接,虽然它与服务器完美连接,但在传输文件时遇到问题. 出于安全原因,订购应用程序的客户端在使用PROT P时请求在数据连接上恢复TLS会话. 因此,我在服务器上启用了此选项: 正如我所说,我可以连接到服务器,但不能传输文件. 如果我取消激活“使用PROT P时数据连接上所需的TLS会话 我在我的 Android应用程序中使用 Apache Commons FTP library

我通过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传输到服务器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1148232.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存