fastDFS分布式文件系统与文件上传下载

传统的文件上传方式就是将文件直接上传保存到项目服务器中,这样做有以下几个缺点:
1.容错性差,如果服务器出现问题有可能导致上传文件丢失
2.占用服务器资源,上传文件过多会大量消耗服务器资源导致系统性能下降
3.不适应于集群环境,有可能出现上传与下载不在同一个服务器中。

传统的文件上传方式很明显不适用与互联网项目,解决方案就是使用第三方服务器存储上传文件。fastDFS是阿里巴巴开发的开源的轻量级分布式文件系统,具有高可用、高并发、可拓展的优点,符合互联网项目的需求。

fastDFS分布式文件系统的特点:
1.作为第三方服务器分布式文件系统存储文件,提高了容错性
2.上传与下载统一在fastDFS进行,解决了集群资源共享问题
3.浏览器访问远程服务器图片或静态页面时,需要遵循http协议,可以通过ngnix作为http服务器访问fastDFS的资源。

fastDFS在项目中实现文件上传的环境要求:
1.jar包(pom导入坐标)  commos-io  commos-fileupload  fastDFS-client
2.配置文件上传解析器(在springmvc中配置)
3.客户端配置client.conf连接fastDFS服务器

附上项目图片上传部分代码:

前端页面部分

<a class="easyui-linkbutton file" iconCls="icon-upload" >
                         <form id="upload_form">
                            <font size=2>本地上传</font>
                            <input type="file" onchange="doUploadPhoto()" name="file" class="easyui-validatebox" validType="img_upload" />
                         </form>
                    </a>

function doUploadPhoto(){
    if ($('#upload_form').form('validate')) {
        var form = new FormData($("#upload_form")[0]);
        var indexCode=$("#indexCode").val().trim();
        $.ajax({
                type: 'post' ,
                url:"<%=path%>/uploadPhotoPG?indexCode="+indexCode,
                cache:false ,
                data:form ,
                dataType:'json',
                processData:false,
                contentType:false,
                success:function(result){
                    $.messager.show({
                        title:"提示信息", 
                        msg:"上传成功"
                    });
                    setTimeout("location.reload(true)",1000);
                },
                error:function(result){
                    $.messager.show({
                        title:"提示信息", 
                        msg:"未知错误"
                    });
                }
        });
    }
}

请求跳转Controller部分

@ResponseBody
    @RequestMapping(value = "/uploadPhotoPG", method = { RequestMethod.POST})
    @Transactional(propagation=Propagation.REQUIRED)
    public Object  uploadPhotoPG(MultipartFile file,String checkId,String appMenuCode,String storeyId,String indexCode) {  
        try{
            UploadLocalOrWeb uploadLocalOrWeb = new UploadLocalOrWeb();
            String suffix = file.getOriginalFilename().split("\\.")[file.getOriginalFilename().split("\\.").length-1];
            String url = uploadLocalOrWeb.uploadWeb(file.getBytes(), suffix);

            Photo photo = new Photo();
            photo.setId(UuidUtil.create());
            photo.setIndexCode(indexCode);
            photo.setUrl(url);
            photo.setUploadtime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            photo.setIsWriteReport("Y");
            photoService.create(photo);
            msg="上传成功";
            code= "1";
            map.put("msg", msg);
            map.put("code", code);
        }catch(Exception e){
            //回滚事务
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
            e.printStackTrace();
            msg="上传失败";
            code= "-1";
            map.put("msg", msg);
            map.put("code", code);
        }

        return map;  
    }

fastDFS工具类(实现上传功能)

package com.ra.fastdfs;

import java.io.File;
import java.io.InputStream;
import java.util.Properties;


/**
 * 上传控制
 * 选择上传到本地  或是 上传到远程服务器
 * @author MrC
 *
 */
public class UploadLocalOrWeb {
    //远程服务器地址
    @SuppressWarnings("unused")
    private static String proxy_server = "121.15..";

    @SuppressWarnings("unused")
    private static String http = "http://";

    //选择从本地项目下载还是从远程服务器下载文件
    private static String LoadFromLocalOrWeb = "web";

    /**
     * 读取配置文件
     * @throws Exception 
     */
    private void loadProperty() throws Exception {
        Properties prop=new Properties();
        InputStream is = this.getClass().getResourceAsStream("/fastdfs.properties");
        prop.load(is);
        is.close();
        proxy_server = prop.getProperty("proxy_server").trim(); 
        LoadFromLocalOrWeb = prop.getProperty("LoadFromLocalOrWeb").trim(); 
    }



    /**
     * 上传到本地
     * @param buffer  上传的文件数组
     * @param path    如:D://upload/
     * @param fileExtName  如:"doc"
     * @param fileName      如:"image1"
     * @return
     */
    public String uploadLocal(byte[] buffer, String reqPath, String folder, String fileExtName, String fileName)throws Exception{
        String path = reqPath + File.separator + folder;
        String url = "";
        String filePathName = "";
        File file = new File(path);
        if (!file.exists()) { //判断文件夹是否存在,如果不存在则创建文件夹
            file.mkdir();
        }

        FileAndByte fab = new FileAndByte();
        filePathName = fileName + FileUtils.randomName(fileExtName);
        fab.byte2File(buffer, path, filePathName);
        url = folder + File.separator + filePathName;
        return url;
    }

    /** 上传到远程服务器 
     * @throws Exception **/
    public String uploadWeb(byte[] buffer,String fileExtName) throws Exception{
        FastDFSClient client = new FastDFSClient();
        String url,url2 = "";
        //调用远程服务器保存文件,返回文件保存url
        url2 = client.upload(buffer,fileExtName);
        //url = http + proxy_server +":7788"+ File.separator + url;
        url = ReadPropertyUtil.getInstance("fastdfs.properties").getProperty("proxy_server").trim();
        String str = ReadPropertyUtil.getInstance("fastdfs.properties").getProperty("http.tracker_server_port").trim();
        url = "http://"+url + ":" + str + File.separator + url2 ;
        return url;
    }

    /**
     * @desc 图片压缩上传
     *         先上传到本地,再压缩,再上传到图片真正上传的位置
     * @author MrC
     * 实际上传地址 reqPath + folder
     * @param buffer              上传的文件数组     ***必需
     * @param reqPath      如: D://images/    ***上传到本地必需 request.getServletContext().getRealPath("/")
     * @param folder       如: upload/case/   ***上传到本地必需  上传文件夹
     * @param fileName            如:"image1" ***上传到本地必需
     * @param fileExtName  如:"doc"    ***上传到远程服务器必需
     * @throws Exception 
     */
    public String compressImgAndUpload(byte[] buffer, String reqPath, String folder, String fileExtName, String fileName) throws Exception{
        String url = "";

        FileUtils fu = new FileUtils();
        FileAndByte fab = new FileAndByte();
        // 缓存图片
        url = uploadLocal(buffer, reqPath, "upload/cache", fileExtName, fileName);
        // 压缩图片
        fu.compressPic(reqPath+File.separator+url);
        // 压缩后的缓存图片 转成 byte[] 以便上传到文件服务器
        byte[] buff = fab.File2byte(reqPath+File.separator+url);
        // 调用远程服务器保存文件,返回文件保存url
        url = DoUpload(buff, reqPath, folder, fileExtName, fileName);
        return url;
    }


    /**
     * 上传到本地或是远程服务器
     * 实际上传地址 reqPath + folder
     * @param buffer  上传的文件数组     ***必需
     * @param reqPath    如: D://images/    ***上传到本地必需 request.getServletContext().getRealPath("/")
     * @param folder     如: upload/case/   ***上传到本地必需  上传文件夹
     * @param fileName            如:"image1" ***上传到本地必需
     * @param fileExtName  如:"doc"    ***上传到远程服务器必需
     * @return
     * @throws Exception 
     */
    public String DoUpload(byte[] buffer, String reqPath, String folder, String fileExtName, String fileName) throws RuntimeException{
        String url = "";
        try {
            loadProperty();//读取配置文件
            if(LoadFromLocalOrWeb.equals("web")){
                //上传至远程服务器
                url = uploadWeb(buffer, fileExtName);
            }else{
                //上传至项目路径
                url = uploadLocal(buffer, reqPath, folder, fileExtName, fileName);
            }
        } catch (Exception e) {
            throw new RuntimeException();
        }
        return url;
    }
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FastDFS(Fast Distributed File System)是一个轻量级的分布式文件系统,由中国研究院研发并开源。它基于一种称为"Tracker"的服务器来管理存储节点,实现文件的分布式存储和访问。FastDFS的设计目标是高性能、高可靠性和易扩展性。 在FastDFS中,文件被划分成多个固定大小的块,每个块都被存储在不同的存储节点上。存储节点之间通过网络连接进行通信,客户端可以通过Tracker服务器查找文件所在的存储节点,并直接与存储节点进行交互。 FastDFS的核心组件包括Tracker服务器和Storage服务器。Tracker服务器负责管理存储节点的状态信息和文件的元数据,而Storage服务器则负责实际的文件存储和读取操作。当有文件上传请求时,Tracker服务器会选择一个可用的Storage服务器来保存文件,并返回存储节点的地址信息给客户端。 FastDFS具有以下特点: 1. 高性能:FastDFS采用了基于磁盘顺序读写的方式,能够提供较高的文件上传下载速度。 2. 高可靠性:FastDFS使用冗余存储和自动故障恢复机制,确保文件的可靠性和数据安全。 3. 易扩展性:FastDFS支持水平扩展,可以根据需要增加存储节点和Tracker服务器,以适应不断增长的存储需求。 4. 简单易用:FastDFS提供了简单的API和命令行工具,方便开发者进行文件的上传、下载和管理操作。 总而言之,FastDFS是一个可靠、高性能的分布式文件系统,适用于需要存储大量文件的场景,如图片、视频等多媒体文件的存储和访问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值