引言

  上回说到普通的文件上传,直接利用IO进行的,这回跟大家介绍一个工具——FastDFS,看它是如何实现文件上传的。

什么是FastDFS?

  FastDFS是用C语言编写的一款开源的分布式文件系统,FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

文件上传的流程

  FastDFS用到了Tracker和Storage,Tracker是一个中间处理程序,client端通过跟Tracker进行通讯,了解到Storage的相关信息,然后直接通过跟Storage进行数据存储。Client端,Tracker和Storage的通讯如下图所示:
这里写图片描述

文件上传过程

  文件的上传过程如下图所示:

这里写图片描述

  文件上传的代码:

/*
* 上传文件
 */
@RequestMapping(value={"/upload"})
@ResponseBody
public void upload( MultipartFile file, HttpServletRequest request,HttpServletResponse response,ModelMap model){        
        //获取文件扩展名
        String ext_Name = file.getOriginalFilename().split("\\.")[1];
        //获取文件名
        String videoName=file.getOriginalFilename().split("\\.")[0];

        byte[] bytes = null;
        try {
            bytes = file.getBytes(); //将文件转换成字节流形式
        } catch (IOException e) {
            e.printStackTrace();
        }
        //调用上传文件的具体方法
        String videoPath=uploadFile(bytes,ext_Name); 
        JacksonJsonUntil jackJsonUtil =new JacksonJsonUntil ();

        //设置文件信息,返回到页面上
        Video video=new Video();
        video.setVideoPath(videoPath);
        video.setVideoName(videoName);      

        jackJsonUtil.beanToJson(response,video);
    } 
    /*
     * 利用字节流上传文件
     */
    public String uploadFile(byte[] byteFile, String ext_file) {
        // 拼接服务区的文件路径
        StringBuffer sbPath = new StringBuffer();
        sbPath.append("http://192.168.22.252");
        try {
            // 初始化文件资源
            ClientGlobal
                    .init("F:\\project\\dmsd-itoo-video\\wanghongyun-video-0817\\dmsd-itoo-video-parent\\dmsd-itoo-video-web\\src\\main\\resources\\fdfs_client.conf");

            // 链接FastDFS服务器,创建tracker和Stroage
            TrackerClient trackerClient = new TrackerClient();
            TrackerServer trackerServer = trackerClient.getConnection();
            StorageServer storageServer = null;
            StorageClient storageClient = new StorageClient(trackerServer,
                    storageServer);

            //利用字节流上传文件
            String[] strings = storageClient.upload_file(byteFile, ext_file, null);

            for (String string : strings) {
                sbPath.append("/" + string);
                System.out.println(string);
            }
            // 全路径
            System.out.println(sbPath);
        } catch (IOException | MyException e) {
            e.printStackTrace();
        }
        return sbPath.toString();
    }

  看下边的代码部分:

这里写图片描述

  TrackerServer利用TrackerClient建立连接之后,StorageClient就可以直接跟StorageServer进行相关的存储操作了。

文件下载过程

  文件下载流程如下:

这里写图片描述

  由于我们的视频系统尚未开发下载功能,所以代码部分稍后补上。

总结

  如果有兴趣的可以试试,FastDFS的上传速度是很快的,我们还用到了nginx的反向代理功能进行文件获取,用FastDFS收获到挺多东西的。
  除了FastDFS外,还有一种文件上传方式,是淘淘商城里的,但是我还没有尝试,所以从红霞那里把她的总结博客扯过来吧~博客地址:http://blog.csdn.net/hhx0626/article/details/52516614

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐