ftp文件上传之性能分析

最近遇到视频上传很慢的情况,20M大约需要花费一分钟才能上传玩,但是通过ftp测试,发现时长4s左右,阿里云2M的带宽,以下的测试都是以阿里云2M的带宽做的一个测试的结果。

1.不带缓冲区

2M带宽下,20M的视频,上传时长大约为60s,多次测试,取平均值

     /**
 * 上传文件(可供Action/Controller层使用)
 * 
 * @param hostname
 *            FTP服务器地址
 * @param port
 *            FTP服务器端口号
 * @param username
 *            FTP登录帐号
 * @param password
 *            FTP登录密码
 * @param pathname
 *            FTP服务器保存目录
 * @param fileName
 *            上传到FTP服务器后的文件名称
 * @param inputStream
 *            输入文件流
 * @return
 */
public static boolean uploadFile(String hostname, int port, String username, String password, String pathname,
        String fileName, InputStream inputStream) {
    boolean flag = false;
    FTPClient ftpClient = new FTPClient();
    ftpClient.setControlEncoding("UTF-8");
    try {
        // 连接FTP服务器
        ftpClient.connect(hostname, port);
        // 登录FTP服务器
        ftpClient.login(username, password);
        // 是否成功登录FTP服务器
        int replyCode = ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(replyCode)) {
            return flag;
        }
        //指定上传文件的类型  二进制文件
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        //检查上传路径是否存在 如果不存在返回false
        boolean pathFlagExist = createDir(ftpClient, pathname);
        if(!pathFlagExist){
            return false;
        }
	//这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上或者其他服务器上面,由于安全限制,可能某些端口没有开启,所以就出现阻塞。OK,问题解决。、      
  ftpClient.enterLocalPassiveMode();
        //设置上传目录  
        ftpClient.changeWorkingDirectory(pathname);
   
        ftpClient.storeFile(fileName, inputStream);
        inputStream.close();
        ftpClient.logout();
        flag = true;
    } catch (Exception e) {
        logger.info("上传失败"+e);
    } finally {
        if (ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                logger.info("上传文件-->关闭连接失败"+e);
            }
        }
    }
    return flag;
}

2.增加缓存代码

2M带宽下,20M的视频,上传时长大约为11s,多次测试,取平均值

 /**
 * 上传文件(可供Action/Controller层使用)
 * 
 * @param hostname
 *            FTP服务器地址
 * @param port
 *            FTP服务器端口号
 * @param username
 *            FTP登录帐号
 * @param password
 *            FTP登录密码
 * @param pathname
 *            FTP服务器保存目录
 * @param fileName
 *            上传到FTP服务器后的文件名称
 * @param inputStream
 *            输入文件流
 * @return
 */
public static boolean uploadFile(String hostname, int port, String username, String password, String pathname,
        String fileName, InputStream inputStream) {
    boolean flag = false;
    FTPClient ftpClient = new FTPClient();
    ftpClient.setControlEncoding("UTF-8");
    try {
        // 连接FTP服务器
        ftpClient.connect(hostname, port);
        // 登录FTP服务器
        ftpClient.login(username, password);
        // 是否成功登录FTP服务器
        int replyCode = ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(replyCode)) {
            return flag;
        }
        //指定上传文件的类型  二进制文件
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        //检查上传路径是否存在 如果不存在返回false
        boolean pathFlagExist = createDir(ftpClient, pathname);
        if(!pathFlagExist){
            return false;
        }
        //这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上或者其他服务器上面,由于安全限制,可能某些端口没有开启,所以就出现阻塞。OK,问题解决。
        ftpClient.enterLocalPassiveMode();
        //设置上传目录  
        ftpClient.changeWorkingDirectory(pathname);
        ftpClient.setBufferSize(1024*1024);
        BufferedInputStream input = new BufferedInputStream(inputStream);
        ftpClient.storeFile(fileName, input);
        inputStream.close();
        ftpClient.logout();
        flag = true;
    } catch (Exception e) {
        logger.info("上传失败"+e);
    } finally {
        if (ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                logger.info("上传文件-->关闭连接失败"+e);
            }
        }
    }
    return flag;
}

实际上就是增加两句话

添加缓冲区的方式,根据上传文件的大 小,设置缓冲区大小,上传的过程中,缓冲区写满后才会进行磁盘的读写操作

ftpClient.setBufferSize(1024*1024);
BufferedInputStream input = new BufferedInputStream(inputStream);
3.结论

通过设置缓冲区,性能大小差不多提升了快6倍,如果有好的优化方法,可以在下方留言

如果你热衷技术,喜欢交流,欢迎加入我们!

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以回答这个问题。使用jfinal框架可以很方便地实现ftp文件上传。首先需要在pom.xml文件中添加jfinal-ftp的依赖,然后在Controller中编写上传文件的方法,使用FTPKit工具类进行文件上传。具体实现可以参考jfinal官方文档或者相关的教程。 ### 回答2: JFinal是一个基于Java的轻量级、高性能的Web框架,它提供了简单易用的API,方便开发人员快速开发Web应用程序。虽然JFinal主要用于开发Web应用程序,但是我们还是可以利用其强大的API来实现FTP文件上传功能。 实现FTP文件上传功能需要借助于Apache Commons Net库。首先,我们需要在项目中引入相应的依赖。在pom.xml文件中添加以下内容: ```xml <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.8.0</version> </dependency> ``` 接下来,我们创建一个Controller类,在该类中编写上传文件的逻辑。首先,我们需要获取上传文件的相关信息,包括文件名、路径等。然后,利用FTPClient类实现与FTP服务器的连接和上传文件的功能。最后,根据上传结果返回相应的提示信息。 以下是一个简单的FTP文件上传的示例代码: ```java import com.jfinal.core.Controller; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import java.io.FileInputStream; import java.io.IOException; public class UploadController extends Controller { public void index() { // 获取上传文件的相关信息 String filename = getPara("filename"); String filepath = getPara("filepath"); // 创建FTPClient对象 FTPClient ftpClient = new FTPClient(); try { // 连接FTP服务器 ftpClient.connect("ftp.example.com", 21); ftpClient.login("username", "password"); // 设置文件传输类型为二进制 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 设置文件上传路径 ftpClient.changeWorkingDirectory(filepath); // 上传文件 FileInputStream fis = new FileInputStream(filename); ftpClient.storeFile(filename, fis); fis.close(); // 上传成功提示信息 renderText("文件上传成功"); } catch (IOException e) { e.printStackTrace(); // 上传失败提示信息 renderText("文件上传失败"); } finally { // 断开与FTP服务器的连接 try { ftpClient.logout(); ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 以上就是使用JFinal框架实现FTP文件上传的简单示例代码。我们可以通过访问URL来调用该接口并传递文件信息,从而实现文件的上传功能。当然,在实际开发中,我们还需要添加一些安全验证、错误处理等功能来完善这个上传文件的功能。 ### 回答3: 使用jfinal编写FTP文件上传功能非常简单。首先要添加jfinal的依赖包到项目中,并配置好jfinal的配置文件。 接着,在Controller类中创建一个方法用于处理文件上传请求。首先,我们需要获取到上传的文件,可以通过使用jfinal提供的方法`getRequest().getFile("file")`来实现。这个方法返回一个UploadFile对象,其中包含了上传的文件信息。 接下来,我们需要将上传的文件保存到FTP服务器上。可以使用Apache Commons Net库中的FTPClient类来实现FTP文件上传功能。首先,我们需要连接到FTP服务器,可以通过调用FTPClient对象的`connect()`方法来连接。然后,使用`login()`方法进行登录。 接着,我们可以使用`changeWorkingDirectory()`方法切换到指定的目录。然后,使用`storeFile()`方法将上传的文件保存到FTP服务器上,其中需要传入服务器上保存的文件名和要上传的文件流。 上传完成后,记得要关闭FTP连接,可以使用`logout()`方法进行退出,然后调用`disconnect()`方法关闭连接。 最后,我们在Controller中处理上传结果,可以返回相应的消息给前端页面,告知上传是否成功。 总结一下,使用jfinal编写FTP文件上传功能主要包括以下步骤:获取上传的文件、连接到FTP服务器、上传文件、关闭FTP连接、处理上传结果。相比传统的socket编程方式,使用jfinal简化了很多操作,提高了开发效率。希望这个简单的回答能帮助到您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值