netty-file-parent

文件上传下载功能组件
授权协议 GPL
开发语言 Java
所属分类 Web应用开发、 文件上传组件
软件类型 开源软件
地区 国产
投 递 者 广宏远
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

基于netty的文件上传下载组件

1.简介

该组件基于netty3.6.3实现,具有如下功能:文件上传,文件替换,文件删除,如果是图片的话,还可以生成缩略图等功能。
使用简单,只需要引入netty-file-client,即可以实现文件的以上操作。
该组件的代码结构分为两部分,客户端组件(netty-flie-client)和服务端组件(netty-flie-server)。如下图所示:

 

2.netty-file-client

2.1 概述

客户端组件主要提供对外访问服务端组件的接口,提供以下接口:文件上传,文件替换,文件删除,如果是图片的话,还可以生成缩略图等功能。代码结构如下:

org.lyx.file.client包是该组件的核心包,FileClient类是对外提供接口的工具类。具有以下方法:

  1. uploadFile 文件上传,对应文件处理句柄类为:UploadFileClientHandler

  2. deleteFile 删除服务端文件,对应文件处理句柄类为:DeleteFileClientHandler

  3. replaceFile 替换服务端文件,对应文件处理句柄类为:ReplaceFileClientHandler

  4. createThumbPicture 生成缩略图,对应文件处理句柄类为:CreateThumbPictureClientHandler

以上所有句柄类的父类均为UploadFileClientHandler,该类实现了一些共有方法,比如一些公共参数的包装等。

2.2 实现步骤

实现步骤以上传文件为例,其他类似实现。
直接上代码:

/**
     * 文件上传
     * @param file 需要上传的文件
     * @param fileName 文件名称
     * @param thumbMark 是否需要生成缩略图
     * @return
     * @author:landyChris
     */
    public static String uploadFile(File file, String fileName,
            boolean thumbMark) {
        FileClientPipelineFactory clientPipelineFactory = new FileClientPipelineFactory();
        //辅助类。用于帮助我们创建NETTY服务
        ClientBootstrap bootstrap = createClientBootstrap(clientPipelineFactory);
        String strThumbMark = Constants.THUMB_MARK_NO;
        if (thumbMark) {
            strThumbMark = Constants.THUMB_MARK_YES;
        }
        //具体处理上传文件逻辑
        uploadFile(bootstrap, FileClientContainer.getHost(),
                FileClientContainer.getPort(), file, fileName, strThumbMark,
                FileClientContainer.getUserName(),
                FileClientContainer.getPassword());
        Result result = clientPipelineFactory.getResult();
        if ((result != null) && (result.isCode())) {
            return result.getFilePath();
        }
        return null;
    }

具有三个参数,前面几行代码都是很一些netty的初始化工作,具体看一个私有方法uploadFile,如下代码所示:

private static void uploadFile(ClientBootstrap bootstrap, String host,
            int port, File file, String fileName, String thumbMark,
            String userName, String pwd) {
        //1.构建uri对象
        URI uri = getUri(host, port);
        //2.连接netty服务端
        ChannelFuture future = bootstrap.connect(new InetSocketAddress(host,
                port));
        //3.异步获取Channel对象
        Channel channel = future.awaitUninterruptibly().getChannel();
        if (!future.isSuccess()) {
            future.getCause().printStackTrace();
            bootstrap.releaseExternalResources();
            return;
        }
        //4.初始化文件上传句柄对象
        WrapFileClientHandler handler = new UploadFileClientHandler(host, uri,
                file, fileName, thumbMark, userName, pwd);
        //5.获取Request对象
        HttpRequest request = handler.getRequest();
        //6.获取Http数据处理工厂
        HttpDataFactory factory = getHttpDataFactory();
        //7.进行数据的包装处理,主要是进行上传文件所需要的参数的设置,此时调用的句柄是具体的UploadFileClientHandler对象
        HttpPostRequestEncoder bodyRequestEncoder = handler
                .wrapRequestData(factory);
        //8.把request写到管道中,传输给服务端
        channel.write(request);
        //9.做一些关闭资源的动作
        if (bodyRequestEncoder.isChunked()) {
            channel.write(bodyRequestEncoder).awaitUninterruptibly();
        }
        bodyRequestEncoder.cleanFiles();
        channel.getCloseFuture().awaitUninterruptibly();
        bootstrap.releaseExternalResources();
        factory.cleanAllHttpDatas();
    }

主要有以下实现步骤:

  1. 构建uri对象

  2. 连接netty服务端

  3. 异步获取Channel对象

  4. 初始化文件上传句柄对象

  5. 获取Request对象

  6. 获取Http数据处理工厂

  7. 进行数据的包装处理,主要是进行上传文件所需要的参数的设置,此时调用的句柄是具体的UploadFileClientHandler对象

  8. 把request写到管道中,传输给服务端

  9. 做一些关闭资源的动作
    具体细节实现请参考github上的代码。如果各位读者喜欢的话,可以加个star哈。

3.netty-file-server

3.1 概述

服务端组件实现功能也是跟客户端一致,具有以下功能:文件上传,文件替换,文件删除,如果是图片的话,还可以生成缩略图等功能。代码结构如下图所示:

org.lyx.file.server包是该组件的核心包。具体的处理句柄类有以下几个:

  1. 文件上传:UploadFileServerHandler

  2. 删除文件:DeleteFileServerHandler

  3. 替换文件:ReplaceFileServerHandler

  4. 生成缩略图:CreateThumbPictureServerHandler

以上所以句柄类的接口均为FileServerProcessor,并且继承了抽象类AbstractFileServerHandler。

3.2 实现步骤

具体实现步骤还是以文件上传为例。
首先org.lyx.file.server.support.FileServerHandler类会持续监听客户端的请求,如果是文件处理动作,则会进入messageReceived方法进行相应的处理逻辑。该类定义了以下成员变量:

//http请求
    private HttpRequest request;
    //是否需要断点续传作业
    private boolean readingChunks;
    //接收到的文件内容
    private final StringBuffer responseContent = new StringBuffer();
    //解析收到的文件
    private static final HttpDataFactory factory = new DefaultHttpDataFactory(DefaultHttpDataFactory.MINSIZE); //16384L
    //post请求的解码类,它负责把字节解码成Http请求。
    private HttpPostRequestDecoder decoder;
    //请求参数
    private RequestParam requestParams = new RequestParam();

该方法实现中,如果文件大小小于chunked的最小值,则直接进行文件上传操作。否则,需要进行分块处理。然后进行文件上传操作。
文件大小小于1k的操作:

需要分块处理操作:


以上操作主要有两个注意点:

  1. 请求参数的解析工作(根据HttpDataType进行相应参数的赋值操作)

  2. 根据解析的参数进行相应的文件处理操作(根据文件操作类型,选择相应的处理句柄进行文件处理)

  • Netty网络应用框架和Mina类似,都封装了Socket。 Mina入门 长连接的基本概念 连接后一直与服务器保持长期连接 长连接的基本原理 底层都是基于TCP/IP协议 通过Socket,ServerSocket与服务器保持连接 服务端一般使用ServerSocket建立监听,监听客户端与之连接 客户端使用Socket,指定端口和IP地址,与服务端进行连接 长连接的意义 通过长连接,可以实现服

  • 简介 在前面的章节中,我们讲解了kqueue的使用和原理,接下来我们再看一下epoll的使用。两者都是更加高级的IO方式,都需要借助native的方法实现,不同的是Kqueue用在mac系统中,而epoll用在liunx系统中。 epoll的详细使用 epoll的使用也很简单,我们还是以常用的聊天室为例来讲解epoll的使用。 对于server端来说需要创建bossGroup和workerGrou

  • by {@link ServerSocketChannel}, will return the {@link ServerSocketChannel} as its parent on {@link #parent()}. The semantics of the hierarchical structure depends on the transport implementation wher

  • 简介 在前面的章节中,我们介绍了在netty中可以使用kequeue或者epoll来实现更为高效的native传输方式。那么kequeue和epoll和NIO传输协议有什么不同呢? 本章将会以kequeue为例进行深入探讨。 在上面我们介绍的native的例子中,关于kqueue的类有这样几个,分别是KQueueEventLoopGroup,KQueueServerSocketChannel和KQ

  • 一.ProtoBuf 对象的序列化与反序列化 1.proto文件的定义 option java_package = "xss.netty.protobuf"; option java_outer_classname = "EmployeeModule"; message Employee{ required int64 emploee_id = 1; required string fir

 相关资料
  • 本文向大家介绍javaweb实现文件上传与下载功能,包括了javaweb实现文件上传与下载功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了javaweb文件的上传与下载,供大家参考,具体内容如下 一、文件上传 要实现Web开发的上传功能,通常需要完成两步操作:一是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。 上传大多数情况是通过表单

  • 本文向大家介绍springboot实现文件上传和下载功能,包括了springboot实现文件上传和下载功能的使用技巧和注意事项,需要的朋友参考一下 spring boot 引入”约定大于配置“的概念,实现自动配置,节约了开发人员的开发成本,并且凭借其微服务架构的方式和较少的配置,一出来就占据大片开发人员的芳心。大部分的配置从开发人员可见变成了相对透明了,要想进一步熟悉还需要关注源码。 1.文件上传

  • 本文向大家介绍spring mvc实现文件上传与下载功能,包括了spring mvc实现文件上传与下载功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了spring mvc实现文件上传与下载功能的具体代码,供大家参考,具体内容如下 文件上传 在pom.xml中引入spring mvc以及commons-fileupload的相关jar 在springmvc.xml中加入文件上传的相

  • 本文向大家介绍SpringBoot实现文件上传下载功能小结,包括了SpringBoot实现文件上传下载功能小结的使用技巧和注意事项,需要的朋友参考一下 最近做的一个项目涉及到文件上传与下载。前端上传采用百度webUploader插件。有关该插件的使用方法还在研究中,日后整理再记录。本文主要介绍SpringBoot后台对文件上传与下载的处理。 单文件上传 如果想要修改文件路径及文件名,修改fileP

  • 本文向大家介绍java文件上传下载功能实现代码,包括了java文件上传下载功能实现代码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了文件上传下载java实现代码,供大家参考,具体内容如下 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: <input type=”file” /> 3. 指定表单类型:     默认类型:enctype="application/x

  • 本文向大家介绍Retrofit+Rxjava实现文件上传和下载功能,包括了Retrofit+Rxjava实现文件上传和下载功能的使用技巧和注意事项,需要的朋友参考一下 Retrofit简介: 在Android API4.4之后,Google官方使用了square公司推出的okHttp替换了HttpClient的请求方式。后来square公司又推出了基于okHttp的网络请求框架:Retrofit。