精华内容
下载资源
问答
  • python flask简单文件上传下载实现
    千次阅读
    2019-06-25 14:04:07

    功能:用python+flask实现简单的文件上传下载,并简单过滤下文件名的“.”和“/”,同时对文件名进行通过uuid重命名,存到服务器上,并将原文件名、重命名等信息保存到db中,需要时从db查询出来还原即可

    PS:简单实现,适合单服务器小附件上传,不适合大文件处理,也不适用于K8S部署,下一篇文章将介绍通过ceph存储文件,适合K8S PVC持久化存储

    实现

    一、在db中定义文件ORM模型:
    #app/db/orm.py
    class Attachments(db.Model):
        __tablename__ = 'attachments'
        id = db.Column(db.String(64), primary_key=True)
        file_name = db.Column(db.String(200), nullable=True)
        file_path = db.Column(db.String(64), index=True, nullable=True)
        uploader = db.Column(db.String(30))
        upload_time = db.Column(db.DateTime, default=datetime.now())
        project_num = db.Column(db.String(11))
    
        def __init__(self, **kwargs):
            super(Attachments, self).__init__(**kwargs)
            if self.id is None:
                self.id = str(uuid.uuid1()).replace('-', '')
    
        __mapper_args__ = {
            "order_by": project_num.desc()
        }
    
        def __repr__(self):
            return '<Attachment %s>' % self.file_name
    
    二、API接口视图类
    #app/api/v1/projects/project.py
    from flask import request
    from flask_restplus import Resource
    ......
    
    @api.route('/<string:project_num>/upload')
    class UploadFile(Resource):
        """
        上传立项附件的API
        """
        @login_required
        @api.doc('upload project attachments')
        @api.marshal_with(model.project_attachment)
        @api.response(return_code.Successful, 'upload success')
        @api.response(return_code.InternalServerError, 'upload failed')
        def post(self, project_num):
            """上传立项相关附件材料"""
            file = request.files.get('file')
            resp = business.upload_project_file(file, project_num)
            return resp, return_code.Successful
    
    
    @api.route('/downloads/<string:file_path>')
    @api.param('file_path', '服务器上真实的文件名')
    class DownloadFile(Resource):
        """
        下载已上传的文件
        """
        @login_required
        @api.doc('get the upload file by path')
        @api.response(return_code.Successful, 'success')
        @api.response(return_code.NotFound, 'file not found')
        def get(self, file_path):
            """下载已上传的文件"""
            return business.download_file(file_path)
    
    
    三、上传、下载业务逻辑实现
    #app/api/v1/projects/business.py
    ......
    
    def secure_filename(filename):
        """
        过滤上传文件的文件名中的特殊字符
        :param filename:
        :return:
        """
        file_first_name = filename.rsplit('.', 1)[0].lower()
        return file_first_name.replace('.','').replace('/','') + '.' + filename.rsplit('.', 1)[1].lower()
    
    def change_filename(filename):
        """
        修改上传文件的文件名避免冲突以及恶意代码
        :param filename:
        :return:
        """
        fileinfo = os.path.splitext(filename)
        filename = datetime.now().strftime("%Y%m%d%H%M%S") + str(uuid.uuid4().hex) + fileinfo[-1]
        return filename
    
    def upload_project_file(file, project_num):
        """
        上传立项附件材料
        :return:
        """
        if not file:
            raise exceptions.MyHttpParameterException('No file part in request')
    
        if file.filename == '':
            raise exceptions.MyHttpParameterException('No selected file')
    
        if allow_file(file.filename):
            origin_file_name = secure_filename(file.filename)
            filename = change_filename(origin_file_name)
            basepath = os.path.abspath(os.getcwd())  # 当前文件所在工作目录
            uploadpath = os.path.join(basepath, UPLOAD_PATH)
            user = g.current_user
    
            try:
                if not os.path.exists(uploadpath):
                    os.makedirs(uploadpath)
    
                file.save(os.path.join(uploadpath, filename))
                # 并将文件信息写入数据库
                attachment = Attachments(file_name=origin_file_name, file_path=filename, uploader=user.name, project_num=project_num)
                db.session.add(attachment)
                db.session.commit()
            except Exception as e:
                logger.error('upload failed --> {}'.format(str(e)))
                raise exceptions.MyHttpServerError('upload failed, an error ocure on server -->{}'.format(str(e)))
    
            # to do with this file
            return attachment
        else:
            raise exceptions.MyHttpForbidden('No allowed file type')
    
    
    def get_project_attachments(project_num):
        """
        获取项目的所有附件信息
        :param project_num:
        :return:
        """
        attachments = Attachments.query.filter_by(project_num=project_num).all()
        return attachments
    
    
    def download_file(file_name):
        """
        根据服务器上真实的文件名下载附件
        :param file_name:
        :return:
        """
        basepath = os.path.abspath(os.getcwd())  # 当前文件所在工作目录
        uploadpath = os.path.join(basepath, UPLOAD_PATH)
    
        if os.path.isfile(os.path.join(uploadpath, file_name)):
            return send_from_directory(uploadpath, file_name, as_attachment=True)
        raise exceptions.MyHttpNotFound('not found file')
    
    
    更多相关内容
  • 本文实例为大家分享了springboot+vue实现文件上传下载的具体代码,供大家参考,具体内容如下 一、文件上传(基于axios的简单上传) 所使用的技术:axios、springboot、vue; 实现思路:通过h5 :input元素标签进行...
  • 文件上传下载预览功能类似百度文库openoffice flex
  • springboot文件上传下载

    2019-03-31 03:59:33
    springboot文件上传下载
  • 主要介绍了C#实现文件上传下载Excel文档示例代码,需要的朋友可以参考下
  • java web工程Html5实现文档上传下载的功能,只是代码,不是完全运行程序,保证自己测试成功。
  • 主要为大家详细介绍了springboot实现文件上传下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • easyui webserver 实现文件上传下载

    热门讨论 2015-03-30 11:44:24
    easyui webserver 实现文件上传下载
  • 该代码是一个使用Java开发的上传下载的一个demo,一共有两种方法,第一种是使用最基础的IO流进行文件的上传,可以了解一下原理。第二种是使用apache的commons-IO包进行文件的上传,其实只要了解了这两种上传文件的...
  • ABAP report报表文件上传下载,有具体的代码。包括EXCEL、TXT的文档上传及下载
  • winform 文件上传下载

    2017-10-25 11:26:43
    包含两个winform文件管理系统。有服务端和客户端。只是两个小demo,还存在些许问题。
  • 前端webupload +后端 springboot 实现大文件上传下载,可实现断点续传,秒传,亲测可用
  • 目前实现方案最多的是通过 大文件分片 来解决上传下载问题,原理: 将需要上传的文件按照一定的分割规则,分割成相同大小的数据块; 初始化一个分片上传任务,返回本次分片上传唯一标识; 按照一定的策略(串行或...

    超大文件上传下载以及提速和限速实现方案,可以实现文件md5加优算法唯一表示、动态文件合并算法、并发文件传输、指定速度下载,可以选择redis或者mysql实现记录。

    最近遇到项目需要使用大文件上传功能,几十个G的文件需要进行上传和下载,采用普通的上传方案已经不再适用,会导致很多问题,例如:

    • 文件上传很慢
    • 无法支持断点续传
    • 经常超时或失败
    • ……

    目前实现方案最多的是通过 大文件分片 来解决上传下载问题,原理:

    • 将需要上传的文件按照一定的分割规则,分割成相同大小的数据块;
    • 初始化一个分片上传任务,返回本次分片上传唯一标识;
    • 按照一定的策略(串行或并行)发送各个分片数据块;
    • 发送完成后,服务端根据判断数据上传是否完整,如果完整,则进行数据块合成得到原始文件。

    实现和解决途径:

    • 文件分割
    • 文件压缩
    • 流式传输
    • 传输编码
      在这里插入图片描述

    当使用 HTTP 进行大文件传输时,我们可以考虑对大文件进行压缩。通常浏览器在发送请求时,都会携带 accept 和 accep

    展开全文
  • 前端开发中总免不了关于文件上传下载需求,文档用来总结一下常用的方法。以及推荐JavaScript经典实例学习资料文章。
  • Java FTP 实现跨服务器文件上传下载

    热门讨论 2013-11-19 13:44:01
    Java 程序实现的 FTP 跨服务器文件上传下载功能。
  • java+Struts+oracle实现文档上传下载,同时变更文件名,并将文件相关信息存入数据库;另外实现pdf、office等文件 在线预览功能
  • C# 多文件上传下载

    热门讨论 2010-09-27 14:07:35
    C# 多文件上传下载C# 多文件上传下载C# 多文件上传下载C# 多文件上传下载C# 多文件上传下载C# 多文件上传下载C# 多文件上传下载C# 多文件上传下载C# 多文件上传下载
  • delphi做的文件上传下载服务器端

    热门讨论 2012-03-22 16:01:02
    delphi做的文件上传下载服务器端,实现多用户上传下载
  • 目录结构二、FastDFS文件上传下载2.1.上传下载流程2.2.上传下载实现2.2.1.配置依赖:因为我们使用的maven来管理工程,所以,我们需要去配pom文件2.2.2.新建fdfs_client.conf文件,在我们的itoo中,我们建立在(src/...


    一、FastDFS是什么?

    1.1.简介

    FastDFS是基于互联网应用的开源分布式文件系统,主要用于大中型网站存储资源文件,如图片、文档、音频、视频等。FastDFS采用类似GFS的架构,用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX 系统。用户端只能通过专有API对文件进行存取访问,不支持POSIX接口方式。准确地讲,GFS以及 FastDFS、mogileFS、HDFS、TFS等类GFS系统都不是系统级的分布式文件系统,而是应用级的分布式文件存储服务。
    FastDFS简介

    1.2.结构组成(Client、Tracker server和Storage server)

    在这里插入图片描述

    Tracker server
    Tracker server类似于GFS中的Master或TFS中的Name server,但与他们很不同的一点是,Tracker server的主要作用是负载均衡和调度,而不负责文件索引和映射。Tracker server在内存中记录分组和Storage server的状态等信息,不记录文件索引信息,其占用的内存量也很少。Tracker server可以只有一个,也可以有多个组成Tracker cluster,这样的好处是可以提高对用户的响应能力和增加容灾性,此时各Tracker server相互对等,冗余备份,由应用端来轮流选择进行访问。
    Storage server
    Storage server完成文件管理的所有功能:存储、同步和提供存取接口,文件和metadata都存储在其上。Storage server类似于GFS中的Chunk server或TFS中的Data server,通常一个Storage server即一台机器,Storage server可以动态新增和删除。FastDFS的存储部分即Storage cluster,分为多个Volume,每个Volume中包括多个Storage server。同一Volume内的各Storage server之间是对等的,存储的内容相同,起冗余容错的作用。文件上传、下载、删除等操作可在Volume内任意一台 Storage server上进行。一个Volume的存储容量取决于该Volume内最小的Storage server的容量,因此Volume内各Storage server的软硬件配置最好是一致的。采用这种分Volume的存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到哪个Volume。当某个Volume的访问压力较大时,可以在该Volume内增加Storage server来扩充服务能力(纵向扩容)。当系统总容量不足时,可以增加Volume来扩充存储容量(横向扩容)。
    Storage server直接利用OS的文件系统存储文件。FastDFS不会对文件进行分块存储,客户端上传的文件和Storage server上的文件一一对应。
    关于Storage server的同步,不同Volume的Storage server之间不会相互通信,同Volume内的Storage server之间会相互连接进行文件同步。文件同步采用push方式,接受更新操作的文件称为源文件,其所在server称为源服务器,其它文件称为备份文件,其它server称为目标服务器。当文件更新操作发生时,源服务器向目标服务器发起同步,对所有备份文件进行更新。当有新Storage server加入本Volume时,由已有的一台 Storage server将其上的所有文件同步给该新增服务器。具体的同步实现在Storage server中由专门线程根据binlog进行,binlog记录了文件上传、删除等更新操作。为了最大程度地避免相互影响以及出于系统简洁性考虑,Storage server对同Volume内除自己以外的每台服务器都会启动一个线程来负责文件同步。
    这种异步的同步方式带来了一致性问题,当源文件尚未来得及将所有备份文件同步更新时,访问这些备份文件将引发错误。文件的访问主要分为更新和下载两种情况:FastDFS规定更新操作只能对源文件进行,从而避免了同时对不同的备份文件进行更新导致的冲突;文件下载时,Tracker server记录了各Storage server中各文件的同步情况,会向Client提供同步后的文件所在的Storage server。

    1.3.FastDFS下载安装教程

    分布式文件系统FastDFS安装教程

    1.4.目录结构

    tracker server目录及文件结构:

    ${base_path}
    |__data
    | |__storage_groups.dat:存储分组信息
    | |__storage_servers.dat:存储服务器列表
    |__logs
    |__trackerd.log:tracker server日志文件
    数据文件storage_groups.dat和storage_servers.dat中的记录之间以换行符(\n)分隔,字段之间以西文逗号(,)分隔。
    storage_groups.dat中的字段依次为:
    (1) group_name:组名
    (2) storage_port:storage server端口号
    storage_servers.dat中记录storage server相关信息,字段依次为:
    (1) group_name:所属组名
    (2) ip_addr:ip地址
    (3) status:状态
    (4) sync_src_ip_addr:向该storage server同步已有数据文件的源服务器
    (5) sync_until_timestamp:同步已有数据文件的截至时间(UNIX时间戳)
    (6) stat.total_upload_count:上传文件次数
    (7) stat.success_upload_count:成功上传文件次数
    (8) stat.total_set_meta_count:更改meta data次数
    (9) stat.success_set_meta_count:成功更改meta data次数
    (10) stat.total_delete_count:删除文件次数
    (11) stat.success_delete_count:成功删除文件次数
    (12) stat.total_download_count:下载文件次数
    (13) stat.success_download_count:成功下载文件次数
    (14) stat.total_get_meta_count:获取meta data次数
    (15) stat.success_get_meta_count:成功获取meta data次数
    (16) stat.last_source_update:最近一次源头更新时间(更新操作来自客户端)
    (17) stat.last_sync_update:最近一次同步更新时间(更新操作来自其他storage server的同步)

    storage server目录及文件结构:

    KaTeX parse error: Expected group after '_' at position 18: …ase_path} |_̲_data | …{ip_addr}_${port}.mark:存放向目标服务器同步的完成情况
    | |
    | |__一级目录:256个存放数据文件的目录,目录名为十六进制字符,如:00, 1F
    | |__二级目录:256个存放数据文件的目录,目录名为十六进制字符,如:0A, CF
    |__logs
    |__storaged.log:storage server日志文件
    .data_init_flag文件格式为ini配置文件方式,各个参数如下:
    #storage_join_time:本storage server创建时间;
    #sync_old_done:本storage server是否已完成同步的标志(源服务器向本服务器同步已有数据);
    #sync_src_server:向本服务器同步已有数据的源服务器IP地址,没有则为空;
    #sync_until_timestamp:同步已有数据文件截至时间(UNIX时间戳);
    storage_stat.dat文件格式为ini配置文件方式,各个参数如下:
    #total_upload_count:上传文件次数
    #success_upload_count:成功上传文件次数
    #total_set_meta_count:更改meta data次数
    #success_set_meta_count:成功更改meta data次数
    #total_delete_count:删除文件次数
    #success_delete_count:成功删除文件次数
    #total_download_count:下载文件次数
    #success_download_count:成功下载文件次数
    #total_get_meta_count:获取meta data次数
    #success_get_meta_count:成功获取meta data次数
    #last_source_update:最近一次源头更新时间(更新操作来自客户端)
    #last_sync_update:最近一次同步更新时间(更新操作来自其他storage server)
    binlog.index中只有一个数据项:当前binlog的文件索引号
    binlog.###,###为索引号对应的3位十进制字符,不足三位,前面补0。索引号基于0,最大为999。一个binlog文件最大为1GB。记录之间以换行符(\n)分隔,字段之间以西文空格分隔。字段依次为:
    (1)timestamp:更新发生时间(Unix时间戳)
    (2)op_type:操作类型,一个字符
    (3)filename:操作(更新)的文件名,包括相对路径,如:5A/3D/FE_93_SJZ7pAAAO_BXYD.S
    KaTeX parse error: Expected group after '_' at position 10: {ip_addr}_̲{port}.mark:ip_addr为同步的目标服务器IP地址,port为本组storage server端口。例如:10.0.0.1_23000.mark。文件格式为ini配置文件方式,各个参数如下:
    #binlog_index:已处理(同步)到的binlog索引号
    #binlog_offset:已处理(同步)到的binlog文件偏移量(字节数)
    #need_sync_old:同步已有数据文件标记,0表示没有数据文件需要同步
    #sync_old_done:同步已有数据文件是否完成标记,0表示未完成,1表示已完成
    #until_timestamp:同步已有数据截至时间点(UNIX时间戳)
    #scan_row_count:已扫描的binlog记录
    #sync_row_count:已同步的binlog记录数
    数据文件名由系统自动生成,包括三部分:当前时间(Unix时间戳)、文件大小(字节数)和随机数。文件名长度为16字节。文件按照PJW Hash算法hash到65536(256*256,默认配置下)个目录中分散存储。

    二、FastDFS文件上传下载

    2.1.上传下载流程

    1.上传流程:
    在这里插入图片描述

    1.Client通过Tracker server查找可用的Storage server。
    2.Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
    3.Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。
    4.上传完成,Storage server返回Client一个文件ID,文件上传结束。

    2.下载流程:
    在这里插入图片描述

    1.Client通过Tracker server查找要下载文件所在的的Storage server。
    2.Tracker server向Client返回包含指定文件的某个Storage server的IP地址和端口号。
    3.Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并指定要下载文件。
    4.下载文件成功。

    2.2.上传下载实现

    2.2.1.配置依赖:因为我们使用的maven来管理工程,所以,我们需要去配pom文件

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    
        <modelVersion>4.0.0</modelVersion>     
        <groupId>com.leech</groupId>    
        <artifactId>fastdfs-demo</artifactId>    
        <version>0.0.1-SNAPSHOT</version>    
        <packaging>jar</packaging>     
        <name>fastdfs-demo</name>    
        <url>http://maven.apache.org</url>     
        <properties>      
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    
        </properties>     
          
        <dependencies>      
            <dependency>        
                <groupId>junit</groupId>        
                <artifactId>junit</artifactId>        
                <version>4.11</version>        
                <scope>test</scope>      
            </dependency>           
            <dependency>        
                <groupId>org.csource</groupId>        
                <artifactId>fastdfs-client-java</artifactId>        
                <version>1.25</version>      
            </dependency>           
            <dependency>          
                <groupId>commons-io</groupId>          
                <artifactId>commons-io</artifactId>          
                <version>2.4</version>      
                </dependency>         
            </dependencies>  
        </project>  
    

    2.2.2.新建fdfs_client.conf文件,在我们的itoo中,我们建立在(src/main/resources底下)

    connect_timeout = 2
    network_timeout = 30
    charset = UTF-8
    http.tracker_http_port = 80
    #没什么用
    http.anti_steal_token = no
    http.secret_key = FastDFS1234567890
    tracker_server = 192.168.17.112:22122
    #tracker_server = 192.168.0.119:22122

    2.2.3.实现文件上传

       public void save(HttpServletRequest request,HttpServletResponse response){          
        String videoName=request.getParameter("videoName");  
        String videoType=request.getParameter("videoType");  
        String videoDesc=request.getParameter("videoDesc");  
        String videoPath=request.getParameter("videoPath");  
        String picturePath=request.getParameter("picturePath");  
      
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        Date uploadTime=null;  
        try {  
            uploadTime = formatter.parse(formatter.format(new Date()));  
        } catch (ParseException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
          
        JacksonJsonUntil jackJsonUtil =new JacksonJsonUntil ();  
          
        String dataBaseName = "itoo_video";  
      
        Video video=new Video();  
        video.setUserName("why");  
        video.setUserID("why");       
        video.setVideoName(videoName);  
        video.setVideoPath(videoPath);  
        video.setVideoType(videoType);  
        video.setVideoDesc(videoDesc);    
        video.setDataBaseName(dataBaseName);  
        video.setPicturePath(picturePath);  
        video.setUploadTime(uploadTime);  
          
        uploadFileService.save(video);        
          
           jackJsonUtil.beanToJson(response,video);  
          
    }  
      
    /* 
     * 上传文件 
     */  
    @RequestMapping(value={"/upload"})  
    @ResponseBody  
    public void upload( MultipartFile file, HttpServletRequest request,HttpServletResponse response){         
          
        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("C:\\Users\\alsr\\Desktop\\ITOO-5.0\\itoo-video-Test\\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();  
    }  
    

    只要我们能正常接收到一个json类型的字符串(url地址),就证明我们已经上传成功了,如果不信,可以直接用浏览器去验证一下,看看能不能得到文件展示。

    2.2.4.FastDFS实现文件下载

    public void testDownload() {          
            try {               
                ClientGlobal.init(conf_filename);               
                TrackerClient tracker = new TrackerClient();               
                TrackerServer trackerServer = tracker.getConnection();              
                StorageServer storageServer = null;               
                StorageClient storageClient = new StorageClient(trackerServer, storageServer);               
                byte[] b = storageClient.download_file("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");               
                System.out.println(b);               
                IOUtils.write(b, new FileOutputStream("D:/"+UUID.randomUUID().toString()+".conf"));          
                }   
            catch (Exception e) {               
                e.printStackTrace();           
            }       
        }         
    

    2.2.5.FastDFS获取将上传文件信息

    public void testGetFileInfo(){           
            try {               
                ClientGlobal.init(conf_filename);               
                TrackerClient tracker = new TrackerClient();               
                TrackerServer trackerServer = tracker.getConnection();               
                StorageServer storageServer = null;               
                StorageClient storageClient = new StorageClient(trackerServer, storageServer);               
                FileInfo fi = storageClient.get_file_info("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");               
                System.out.println(fi.getSourceIpAddr());             System.out.println(fi.getFileSize());               
                System.out.println(fi.getCreateTimestamp());             System.out.println(fi.getCrc32());           
                }     
            catch (Exception e) {               
                e.printStackTrace();           
                }       
            }         
    

    2.2.6.FastDFS获取文件名称

    public void testGetFileMate(){           
            try {              
                ClientGlobal.init(conf_filename);               
                TrackerClient tracker = new TrackerClient();               
                TrackerServer trackerServer = tracker.getConnection();               
                StorageServer storageServer = null;               
                StorageClient storageClient = new StorageClient(trackerServer,                       
                storageServer);               
                NameValuePair nvps [] = storageClient.get_metadata("group1","M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");               
                for(NameValuePair nvp : nvps){                   
                    System.out.println(nvp.getName() + ":" + nvp.getValue());              
                    }           
                } catch (Exception e) {               
                	e.printStackTrace();           
                }       
        }    
    

    2.2.7.FastDFS实现删除文件

    public void testDelete(){           
    try {               
        ClientGlobal.init(conf_filename);               
        TrackerClient tracker = new TrackerClient();               
        TrackerServer trackerServer = tracker.getConnection();               
        StorageServer storageServer = null;               
        StorageClient storageClient = new StorageClient(trackerServer,storageServer);               
        int i = storageClient.delete_file("group1","M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");               
        System.out.println( i==0 ? "删除成功" : "删除失败:"+i);           
        } catch (Exception e) {               
        	e.printStackTrace();           
        }       
    }  
    

    2.2.8.FastDFS查询文件

    //查询文件
    @Test
    public void testQueryFile() throws IOException, MyException {
    	ClientGlobal.initByProperties("config/fastdfs‐client.properties");
    	TrackerClient tracker = new TrackerClient();
    	TrackerServer trackerServer = tracker.getConnection();
    	StorageServer storageServer = null;
    	StorageClient storageClient = new StorageClient(trackerServer,storageServer);
    	FileInfo fileInfo = storageClient.query_file_info("group1","M00/00/01/wKhlQFrKBSOAW5AWAALcAg10vf4862.png");
    	System.out.println(fileInfo);
    }
    

    三、FastDFS+Nginx(单点部署)事例

    3.1.服务器规划

    跟踪服务器(Tracker Server):ip01
    存储服务器(Storage Server):ip02
    操作系统:CentOS7
    用户:root
    数据存储目录:/fastdfs/tracker
    安装包:
    FastDFS_v5.08.tar.gz:FastDFS源码
    libfastcommon-master.zip:(从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库)
    fastdfs-nginx-module-master.zip:storage节点http服务nginx模块
    nginx-1.10.0.tar.gz:Nginx安装包
    ngx_cache_purge-2.3.tar.gz:图片缓存清除Nginx模块(集群环境会用到)

    下载完成后,将压缩包解压到/usr/local/src目录下

    3.2.所有tracker和storage节点都执行如下操作

    1、安装所需的依赖包

    yum install make cmake gcc gcc-c++
    

    2、安装libfatscommon

    cd /usr/local/src
    #安装unzip 命令: yum install -y unzip zip
    unzip libfastcommon-master.zip    
    cd libfastcommon-master
    #编译、安装
    ./make.sh
    ./make.sh install
    

    3、安装FastDFS

    cd /usr/local/src
    tar -xzvf FastDFS_v5.08.tar.gz
    cd FastDFS
    ./make.sh
    ./make.sh install
    

    采用默认安装方式,相应的文件与目录如下:
    1> 服务脚本:

    /etc/init.d/fdfs_storaged
    /etc/init.d/fdfs_trackerd
    

    2> 配置文件(示例配置文件):

     ll /etc/fdfs/
    -rw-r--r-- 1 root root  1461 14 14:34 client.conf.sample
    -rw-r--r-- 1 root root  7927 14 14:34 storage.conf.sample
    -rw-r--r-- 1 root root  7200 14 14:34 tracker.conf.sample
    

    3> 命令行工具(/usr/bin目录下)

    -rwxr-xr-x    1 root root     260584 14 14:34 fdfs_appender_test
    -rwxr-xr-x    1 root root     260281 14 14:34 fdfs_appender_test1
    -rwxr-xr-x    1 root root     250625 14 14:34 fdfs_append_file
    -rwxr-xr-x    1 root root     250045 14 14:34 fdfs_crc32
    -rwxr-xr-x    1 root root     250708 14 14:34 fdfs_delete_file
    -rwxr-xr-x    1 root root     251515 14 14:34 fdfs_download_file
    -rwxr-xr-x    1 root root     251273 14 14:34 fdfs_file_info
    -rwxr-xr-x    1 root root     266401 14 14:34 fdfs_monitor
    -rwxr-xr-x    1 root root     873233 14 14:34 fdfs_storaged
    -rwxr-xr-x    1 root root     266952 14 14:34 fdfs_test
    -rwxr-xr-x    1 root root     266153 14 14:34 fdfs_test1
    -rwxr-xr-x    1 root root     371336 14 14:34 fdfs_trackerd
    -rwxr-xr-x    1 root root     251651 14 14:34 fdfs_upload_appender
    -rwxr-xr-x    1 root root     252781 14 14:34 fdfs_upload_file
    

    3.3.配置tracker服务器

    1> 复制tracker样例配置文件,并重命名

     cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
    

    2> 修改tracker配置文件

    vim /etc/fdfs/tracker.conf
    

    修改的内容如下:

    disabled=false              # 启用配置文件
    port=22122                  # tracker服务器端口(默认22122)
    base_path=/fastdfs/tracker  # 存储日志和数据的根目录
    

    其它参数保留默认配置, 具体配置解释可参考官方文档说明:FastDFS配置文件详解

    3> 创建base_path指定的目录

    mkdir -p /fastdfs/tracker
    

    4> 防火墙中打开tracker服务器端口( 默认为 22122)

    vi /etc/sysconfig/iptables 
    

    附加:若/etc/sysconfig 目录下没有iptables文件可随便写一条iptables命令配置个防火墙规则:如:

    iptables -P OUTPUT ACCEPT
    

    然后用命令:service iptables save 进行保存,默认就保存到 /etc/sysconfig/iptables 文件里。这时既有了这个文件。防火墙也可以启动了。接下来要写策略,也可以直接写在/etc/sysconfig/iptables 里了。

    添加如下端口行:

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT 
    

    重启防火墙

    service iptables restart
    

    5> 启动tracker服务器

     /etc/init.d/fdfs_trackerd start
    

    初次启动,会在/fastdfs/tracker目录下生成logs、data两个目录。

    drwxr-xr-x 2 root root 4096 14 15:00 data
    drwxr-xr-x 2 root root 4096 14 14:38 logs
    

    检查FastDFS Tracker Server是否启动成功:

    ps -ef | grep fdfs_trackerd
    

    在这里插入图片描述

    3.4.配置storage服务器

    1> 复制storage样例配置文件,并重命名

    cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
    

    2> 编辑配置文件

    vi /etc/fdfs/storage.conf
    

    修改的内容如下:

    disabled=false                      # 启用配置文件
    port=23000                          # storage服务端口
    base_path=/fastdfs/storage          # 数据和日志文件存储根目录
    store_path0=/fastdfs/storage        # 第一个存储目录
    tracker_server=ip01:22122  # tracker服务器IP和端口
    http.server_port=8888               # http访问文件的端口
    

    其它参数保留默认配置, 具体配置解释可参考官方文档说明:FastDFS配置文件详解

    3> 创建基础数据目录

    mkdir -p /fastdfs/storage
    

    4> 防火墙中打开storage服务器端口( 默认为 23000)

    vi /etc/sysconfig/iptables
    

    #添加如下端口行:

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT
    

    重启防火墙

     service iptables restart
    

    5> 启动storage服务器

    /etc/init.d/fdfs_storaged start
    

    初次启动,会在/fastdfs/storage目录下生成logs、data两个目录。

    drwxr-xr-x 259 root root 4096 Mar 31 06:22 data
    drwxr-xr-x   2 root root 4096 Mar 31 06:22 logs
    

    检查FastDFS Tracker Server是否启动成功:

    [root@gyl-test-t9 ~]# ps -ef | grep fdfs_storaged
    root      1336     1  3 06:22 ?        00:00:01 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
    root      1347   369  0 06:23 pts/0    00:00:00 grep fdfs_storaged
    

    3.5.文件上传测试(ip01)

    1> 修改Tracker服务器客户端配置文件

    cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
    vim /etc/fdfs/client.conf
    

    修改以下配置,其它保持默认

    base_path=/fastdfs/tracker
    tracker_server=ip01:22122
    

    2> 执行文件上传命令

    #/usr/local/src/test.png 是需要上传文件路径
    /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/test.png
    

    返回文件ID号:group1/M00/00/00/tlxkwlhttsGAU2ZXAAC07quU0oE095.png

    (能返回以上文件ID,说明文件已经上传成功)

    3.6.在所有storage节点安装fastdfs-nginx-module

    1>fastdfs-nginx-module作用:

    FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入 文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了 ip01,上传成功后文件 ID 已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 ip02,在文件还 没有复制完成的情况下,客户端如果用这个文件 ID 在 ip02 上取文件,就会出现文件无法访问的 错误。而 fastdfs-nginx-module 可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的 文件无法访问错误。(解压后的 fastdfs-nginx-module 在 nginx 安装时使用)

    2> 解压 fastdfs-nginx-module_v1.16.tar.gz

    cd /usr/local/src
    tar -xzvf fastdfs-nginx-module_v1.16.tar.gz
    

    3> 修改 fastdfs-nginx-module 的 config 配置文件

    cd fastdfs-nginx-module/src
    vi config
    将
    
    CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/" 
    
    修改为:
    
    CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
    

    4>上传当前的稳定版本 Nginx(nginx-1.10.0.tar.gz)到/usr/local/src 目录

    5>安装编译 Nginx 所需的依赖包

    yum install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel
    

    6>编译安装 Nginx (添加 fastdfs-nginx-module 模块)

    cd /usr/local/src/
    tar -zxvf nginx-1.10.0.tar.gz
    cd nginx-1.10.0
    ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src <br>make && make install
    

    比对 nginx下Makefile

    default:        build
     
    clean:
            rm -rf Makefile objs
     
    build:
            $(MAKE) -f objs/Makefile
     
    install:
            $(MAKE) -f objs/Makefile install
     
    modules:
            $(MAKE) -f objs/Makefile modules
     
    upgrade:
            /usr/local/nginx/sbin/nginx -t
     
            kill -USR2 'cat /usr/local/nginx/logs/nginx.pid'
            sleep 1
            test -f /usr/local/nginx/logs/nginx.pid.oldbin
     
            kill -QUIT 'cat /usr/local/nginx/logs/nginx.pid.oldbin'
    

    7>复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录,并修改

    cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
    vi /etc/fdfs/mod_fastdfs.conf
    

    8>修改以下配置:

    	 connect_timeout=10
         base_path=/tmp
         tracker_server=ip01:22122
         storage_server_port=23000
         group_name=group1
         url_have_group_name = true
         store_path0=/fastdfs/storage
    

    9> 复制 FastDFS 的部分配置文件到/etc/fdfs 目录

    cd /usr/local/src/FastDFS/conf<br>
    cp http.conf mime.types /etc/fdfs/
    

    10> 在/fastdfs/storage 文件存储目录下创建软连接,将其链接到实际存放数据的目录

    ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00
    

    11>配置 Nginx

    user nobody;
    worker_processes 1;
    events {
        worker_connections 1024;
    }
    http {
    
        include mime.types;
        default_type application/octet-stream;
        sendfile on;
        keepalive_timeout 65;
        server {
            listen 8888;
            server_name localhost;
            location ~/group([0-9])/M00 {
                ngx_fastdfs_module;
            }
            error_page 500 502 503 504 /50x.html;
            location = /50x.html {
                root html;
            }
        }
    }
    

    A、8888 端口值是要与/etc/fdfs/storage.conf 中的 http.server_port=8888 相对应, 因为 http.server_port 默认为 8888,如果想改成 80,则要对应修改过来。
    B、Storage 对应有多个 group 的情况下,访问路径带 group 名,如**/group1/M00/00/00/xxx**, 对应的 Nginx 配置为:

         location ~/group([0-9])/M00 {
             ngx_fastdfs_module;
    	}
    

    C、如查下载时如发现老报 404,将 nginx.conf 第一行 user nobody 修改为 user root 后重新启动。

    12> 防火墙中打开 Nginx 的 8888 端口

    vi /etc/sysconfig/iptables
    
    添加:
    
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT
     
    #重启防火墙
    service iptables restart
    

    启动 Nginx

    /usr/local/nginx/sbin/nginx<br>(重启 Nginx 的命令为:/usr/local/nginx/sbin/nginx -s reload)
    

    13>通过浏览器访问测试时上传的文件

    http://ip:port/group1/M00/00/00/tlxkwlhttsGAU2ZXAAC07quU0oE095.png 
    or 
    http://ip/group1/M00/00/00/tlxkwlhttsGAU2ZXAAC07quU0oE095.png
    

    四、FastDFS集群部署(实现高可用(HA))

    在这里插入图片描述

    4.1.准备

    1.服务器规划:

    跟踪服务器1【主机】(Tracker Server):192.100.139.121
    跟踪服务器2【备机】(Tracker Server):192.100.139.122
    存储服务器1(Storage Server):192.100.139.121
    存储服务器2(Storage Server):192.100.139.123
    存储服务器3(Storage Server):192.100.139.124

    操作系统:CentOS7
    用户:root
    数据存储目录:

    应用安装目录
    Nginx/opt/nginx
    Fastdfs/usr/bin
    Keepalived/usr/local
    安装包/home/yxgly/resourcese /usr/local/src
    Tracker_data/fastdfs/tracker
    Storage_data/fastdfs/storage

    2.安装包

    FastDFS_v5.08.tar.gz:FastDFS源码
    libfastcommon-master.zip:(从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库)
    fastdfs-nginx-module-master.zip:storage节点http服务nginx模块
    nginx-1.10.0.tar.gz:Nginx安装包
    ngx_cache_purge-2.3.tar.gz:图片缓存清除Nginx模块(集群环境会用到)

    下载完成后,将压缩包解压到/usr/local/src目录下

    4.2.所有tracker和storage节点都执行如下操作

    1、安装所需的依赖包

    yum install make cmake gcc gcc-c++
    

    2、安装libfatscommon

    cd /usr/local/src
    #安装unzip 命令: yum install -y unzip zip
    unzip libfastcommon-master.zip   
    cd libfastcommon-master
    编译、安装
    ./make.sh
    ./make.sh install
    

    3、安装FastDFS

    cd /usr/local/src
    tar -xzvf FastDFS_v5.08.tar.gz
    cd FastDFS
    ./make.sh
    ./make.sh install
    

    采用默认安装方式,相应的文件与目录检查如下:

    1> 服务脚本:

    /etc/init.d/fdfs_storaged
    /etc/init.d/fdfs_trackerd
    

    2> 配置文件(示例配置文件):

    ll /etc/fdfs/
    -rw-r--r-- 1 root root  1461 14 14:34 client.conf.sample
    -rw-r--r-- 1 root root  7927 14 14:34 storage.conf.sample
    -rw-r--r-- 1 root root  7200 14 14:34 tracker.conf.sample
    

    3> 命令行工具(/usr/bin目录下)

    ll /usr/bin/fdfs_*
    -rwxr-xr-x    1 root root     260584 14 14:34 fdfs_appender_test
    -rwxr-xr-x    1 root root     260281 14 14:34 fdfs_appender_test1
    -rwxr-xr-x    1 root root     250625 14 14:34 fdfs_append_file
    -rwxr-xr-x    1 root root     250045 14 14:34 fdfs_crc32
    -rwxr-xr-x    1 root root     250708 14 14:34 fdfs_delete_file
    -rwxr-xr-x    1 root root     251515 14 14:34 fdfs_download_file
    -rwxr-xr-x    1 root root     251273 14 14:34 fdfs_file_info
    -rwxr-xr-x    1 root root     266401 14 14:34 fdfs_monitor
    -rwxr-xr-x    1 root root     873233 14 14:34 fdfs_storaged
    -rwxr-xr-x    1 root root     266952 14 14:34 fdfs_test
    -rwxr-xr-x    1 root root     266153 14 14:34 fdfs_test1
    -rwxr-xr-x    1 root root     371336 14 14:34 fdfs_trackerd
    -rwxr-xr-x    1 root root     251651 14 14:34 fdfs_upload_appender
    -rwxr-xr-x    1 root root     252781 14 14:34 fdfs_upload_file
    

    4.3.配置tracker服务器

    1、复制tracker样例配置文件,并重命名

     cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
    

    2、修改tracker配置文件

    vim /etc/fdfs/tracker.conf
    

    修改的内容如下:

    disabled=false              # 启用配置文件
    port=22122                  # tracker服务器端口(默认22122)
    base_path=/fastdfs/tracker  # 存储日志和数据的根目录
    store_group=group1
    

    其它参数保留默认配置, 具体配置解释可参考官方文档说明:FastDFS配置文件详解
    3、创建base_path指定的目录

    mkdir -p /fastdfs/tracker
    

    4、防火墙中打开tracker服务器端口( 默认为 22122)

    vi /etc/sysconfig/iptables
    

    附加:若/etc/sysconfig 目录下没有iptables文件可随便写一条iptables命令配置个防火墙规则:如:

    iptables -P OUTPUT ACCEPT
    

    然后用命令:service iptables save 进行保存,默认就保存到 /etc/sysconfig/iptables 文件里。这时既有了这个文件。防火墙也可以启动了。接下来要写策略,也可以直接写在/etc/sysconfig/iptables 里了。
    添加如下端口行:

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT
    

    重启防火墙

    service iptables restart
    

    5、启动tracker服务器

     /etc/init.d/fdfs_trackerd start
    

    初次启动,会在/fastdfs/tracker目录下生成logs、data两个目录。

    drwxr-xr-x 2 root root 4096 14 15:00 data
    drwxr-xr-x 2 root root 4096 14 14:38 logs
    

    检查FastDFS Tracker Server是否启动成功:

    ps -ef | grep fdfs_trackerd
    

    4.4.配置storage服务器

    1、复制storage样例配置文件,并重命名

    cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
    

    2、编辑配置文件

    vi /etc/fdfs/storage.conf
    

    修改的内容如下:

    disabled=false                      # 启用配置文件
    port=23000                          # storage服务端口
    base_path=/fastdfs/storage          # 数据和日志文件存储根目录
    store_path0=/fastdfs/storage        # 第一个存储目录
    tracker_server=192.100.139.121:22122  # tracker服务器IP和端口
    tracker_server=192.100.139.122:22122  #tracker服务器IP2和端口[Microsof1] 
    http.server_port=8888               # http访问文件的端口
    

    其它参数保留默认配置, 具体配置解释可参考官方文档说明:FastDFS配置文件详解
    3、创建基础数据目录

    mkdir -p /fastdfs/storage
    

    4、防火墙中打开storage服务器端口( 默认为 23000)

    vi /etc/sysconfig/iptables
    

    #添加如下端口行:

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT
    

    重启防火墙

    service iptables restart 
    

    注:集群环境下
    追踪+存储节点操作步骤一、步骤二、步骤三

    存储节点只做存储则只操作步骤三

    5、启动storage服务器

    /etc/init.d/fdfs_storaged start
    

    初次启动,会在/fastdfs/storage目录下生成logs、data两个目录。

    drwxr-xr-x 259 root root 4096 Mar 31 06:22 data
    drwxr-xr-x   2 root root 4096 Mar 31 06:22 logs 
    

    检查FastDFS Tracker Server是否启动成功:

    [root@gyl-test-t9 ~]# ps -ef | grep fdfs_storaged
    root      1336     1  3 06:22 ?        00:00:01 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
    root      1347   369  0 06:23 pts/0    00:00:00 grep fdfs_storaged
    

    4.5.文件上传测试(ip01)

    1、修改Tracker服务器客户端配置文件

    cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
    vim /etc/fdfs/client.conf
    

    修改以下配置,其它保持默认

    base_path=/fastdfs/tracker
    tracker_server=192.100.139.121:22122  # tracker服务器IP和端口
    tracker_server=192.100.139.122:22122  #tracker服务器IP2和端口 
    

    2、执行文件上传命令

    #/usr/local/src/test.png 是需要上传文件路径
    /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/test.png
    

    返回文件ID号:group1/M00/00/00/tlxkwlhttsGAU2ZXAAC07quU0oE095.png
    (能返回以上文件ID,说明文件已经上传成功)
    也可以 :

    /usr/bin/fdfs_test /etc/fdfs/client.conf upload client.conf
    

    在这里插入图片描述

    4.6.在所有storage节点安装fastdfs-nginx-module

    1、fastdfs-nginx-module 作用说明

    FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了 ip01,上传成功后文件 ID 已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 ip02,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 ip02 上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module 可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。(解压后的 fastdfs-nginx-module 在 nginx 安装时使用)

    2、解压 fastdfs-nginx-module_v1.16.tar.gz

    cd /usr/local/src
    

    tar -xzvf fastdfs-nginx-module_v1.16.tar.gz
    3、修改 fastdfs-nginx-module 的 config 配置文件

    cd fastdfs-nginx-module/src
    vim config
    将
    CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/" 
    修改为:
    CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
    

    4、安装编译 Nginx 所需的依赖包

    yum install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel
    

    5、编译安装 Nginx (添加 fastdfs-nginx-module 模块)

    cd /usr/local/src/
    tar -zxvf nginx-1.10.0.tar.gz
    tar –zxvf ngx_cache_purge_2.3.tar.gz
    cd nginx-1.10.0
    ./configure --prefix=/opt/nginx --add-module=/usr/local/src/fastdfs-nginx-module/src --add-module=/usr/local/src/ngx_cache_purge-2.3
    make && make install
    

    7、复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录,并修改

    cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf      /etc/fdfs/
    vi /etc/fdfs/mod_fastdfs.conf
    

    修改以下配置:

    connect_timeout=10
    base_path=/tmp  
    tracker_server=192.100.139.121:22122  # tracker服务器IP和端口
    tracker_server=192.100.139.122:22122  #tracker服务器IP2和端口
    url_have_group_name=true   #url中包含group名称 
    #在最后添加 [group1] 
    group_name=group1 
    storage_server_port=23000 
    store_path_count=1 
    store_path0=/fastdfs/storage
    

    8、复制 FastDFS 的部分配置文件到/etc/fdfs 目录

    cd /usr/local/src/FastDFS/conf
    cp http.conf mime.types /etc/fdfs/
    

    9、在/fastdfs/storage 文件存储目录下创建软连接,将其链接到实际存放数据的目录

    ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00
    

    10、配置 Nginx

    user nobody;
    worker_processes 1;
    events {
        worker_connections 1024;
    }
    http {
        include mime.types;
        default_type application/octet-stream;
        sendfile on;
        keepalive_timeout 65;
        server {
            listen 8888;
            server_name 192.100.139.121;
            location ~/group1/M00 {
                ngx_fastdfs_module;
            }
            error_page 500 502 503 504 /50x.html;
            location = /50x.html {
                root html;
            }
        }
     upstream storage_server_group1{                                                                                              
                     server 192.100.139.121:8888 weight=10;                                                                              
                     server 192.100.139.123:8888 weight=10;                                                                               
                     server 192.100.139.124:8888 weight=10;                                                                              
            }
    }
    

    说明:

    A、8888 端口值是要与/etc/fdfs/storage.conf 中的 http.server_port=8888 相对应, 因为 http.server_port 默认为 8888,如果想改成 80,则要对应修改过来。
    B、Storage 对应有多个 group 的情况下,访问路径带 group 名,如/group1/M00/00/00/xxx, 对应的 Nginx 配置为:

        location ~/group([0-9])/M00 {
             ngx_fastdfs_module;
    	}
    

    C、如查下载时如发现老报 404,将 nginx.conf 第一行 user nobody 修改为 user root 后重新启动。

    11、防火墙中打开 Nginx 的 8888 端口

    vi /etc/sysconfig/iptables
     添加:
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT
    #重启防火墙
    service iptables restart 
    
    启动nginx : /opt/nginx/sbin/nginx
    (重启 Nginx 的命令为:/opt/nginx/sbin/nginx -s reload)
    

    4.7.验证:通过浏览器访问测试时上传的文件

    切换追踪服务器IP同样可以访问

    http://192.100.139.121:8888/group1/M00/00/00/CmSKtFj13gyAen4oAAH0yXi-HW8296.png
    
    http://192.100.139.122:8888/group1/M00/00/00/CmSKtFj13gyAen4oAAH0yXi-HW8296.png
    

    4.8.Java API 客户端配置

    1、前往GitHub下载Java_client代码。Java_client
    2.在你的项目src/java/resources 下加入文件 fastdfs_client.conf
    注意修改tracker服务器Ip地址:

    connect_timeout = 2
    network_timeout = 30
    charset = ISO8859-1
    http.tracker_http_port = 8888
    http.anti_steal_token = no
    tracker_server=192.100.139.121:22122
    tracker_server=192.100.139.122:22122 
    default_group_name=group1
    

    五、总结

    1.同组之间的storage服务器的端口必须一致(23000)
    2.一台服务器上可以有多个组(group),但是不能有同组的多个storage服务。
    3.如果有使用nginx,则可以不用安装libevent插件,libevent是作为fdfs的http服务的依赖插件,且在5.x之后的版本已经移除这个模块。
    4.启动storage server时,一直处于僵死状态.启动storage server,storage将连接tracker server,如果连不上,将一直重试。直到连接成功,启动才算真正完成!如果集群中有2台tracker server,而其中一台tracker没有启动,可能会导致storage server一直处于僵死状态

    展开全文
  • Django实战之文件上传下载

    千次阅读 多人点赞 2019-09-07 10:47:04
    最近学习django,通过文件上传下载这个小项目,总结下常用的知识点。 做这个案例我有以下需求: 1.要支持一次上传多个文件 2.支持上传后记录上传的数据以及列表展示 3.支持下载和删除文件记录 效果展示 ...

    项目介绍

    最近学习django,通过文件上传下载这个小项目,总结下常用的知识点。
    做这个案例我有以下需求:

    1.要支持一次上传多个文件

    2.支持上传后记录上传的数据以及列表展示

    3.支持下载和删除文件记录

    效果展示

    数据库记录

    开发步骤

    创建项目:

    django-admin startproject file_upload
    cd file_upload
    python manage.py startapp uploader

    目录结构:

    0.settings.py

    LANGUAGE_CODE = 'zh-Hans'
    
    TIME_ZONE = 'Asia/Shanghai'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = False

    1.urls.py

    父:

    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('uploader/', include('uploader.urls'))
    ]

    子:

    from django.contrib import admin
    from django.urls import path, include
    from . import views
    
    app_name = 'uploader'
    
    urlpatterns = [
        path('', views.upload, name='upload'),  # 上传
        path('list/', views.list),  # 列表
        path('download/<id>', views.download, name='download'),  # 下载
        path('delete/<id>', views.delete, name='delete'),  # 删除
    ]

    2.models.py

    from django.db import models
    from django.utils import timezone
    
    '''
    文件记录
    '''
    class FileInfo(models.Model):
        file_name = models.CharField(max_length=500)
        file_size = models.DecimalField(max_digits=10, decimal_places=0)
        file_path = models.CharField(max_length=500)
        upload_time = models.DateTimeField(default=timezone.now())
    

    3.forms.py

    from django import forms
    
    '''
    上传表单
    '''
    class UploadForm(forms.Form):
        file = forms.FileField(
            widget=forms.ClearableFileInput(attrs={'multiple': True}),  # 支持多文件上传
            label='选择文件...',
            help_text='最大100M'
        )
    

    4.views.py

    from django.shortcuts import render
    from django.http import HttpResponseRedirect
    from django.http import HttpResponseRedirect
    from django.http import FileResponse
    from django.template import RequestContext
    from django.urls import reverse
    from django.utils.http import urlquote
    
    from .models import FileInfo
    from .forms import UploadForm
    import os
    
    
    # 上传文件
    def upload(request):
        # Handle file upload
        if request.method == 'POST':
            form = UploadForm(request.POST, request.FILES)
            if form.is_valid():
                files = request.FILES.getlist('file')
                for f in files:
                    file_info = FileInfo(file_name=f.name, file_size=1 if 0 < f.size < 1024 else f.size / 1024, file_path=os.path.join('D:\\upload', f.name))
                    file_info.save()
                    # 上传
                    destination = open(os.path.join("D:\\upload", f.name), 'wb+')
                    for chunk in f.chunks():
                        destination.write(chunk)
                    destination.close()
    
                # 返回上传页
                return HttpResponseRedirect('/uploader/list')
        else:
            form = UploadForm()  # A empty, unbound form
        return render(request, 'uploader/upload.html', {'form': form})
    
    
    # 文件列表
    def list(request):
        file_infos = FileInfo.objects.all()
    
        return render(request, 'uploader/list.html', {'file_infos': file_infos})
    
    
    # 下载文件
    def download(request, id):
        file_info = FileInfo.objects.get(id=id)
        print('下载的文件名:' + file_info.file_name)
        file = open(file_info.file_path, 'rb')
        response = FileResponse(file)
        response['Content-Disposition'] = 'attachment;filename="%s"' % urlquote(file_info.file_name)
        return response
    
    
    # 删除文件
    def delete(request, id):
        file_info = FileInfo.objects.get(id=id)
        file_info.delete()
        file_infos = FileInfo.objects.all()
    
        return HttpResponseRedirect('/uploader/list')

    需要源码的朋友给老徐来个一键三连,留下邮箱安排发送:)

    展开全文
  • fastDFS和文件上传下载

    2018-06-09 18:07:36
    fastDFS和文件上传下载,包含fastdfs技术文档和测试代码,文件上传下载
  • winform实现FTP上传下载、删除文件。自己写的Demo,亲测可用!
  • tomcat 实现文件上传下载

    热门讨论 2012-04-01 16:14:50
    实现文件上传下载的源代码 决定没问题的。 利用了struts2 tomcat
  • javaweb简单实现文件上传下载源代码,仅供参考
  • 阿里对象存储 OSS 文件上传下载,图片上传java前言创建oss 空间购买流量获取Access Key文件上传和下载安装sdk上传下载图片上传和遍历图片上传遍历endpoint 一定要看这个,记着这个词,看这个 前言 本文章文字介绍...
  • C#实现文件上传下载

    万次阅读 2018-07-03 17:12:49
    本文属于个人原创作品、...一、文件上传 1、aspx页面使用file选择文件 <label>选择文件:</label> <input type="file" id="fileUp" name="fileUp" /> 后台获取文件并读取成字节组 files = f...
  • C# WinForm 文件上传下载

    热门讨论 2010-07-20 16:35:09
    实现文件向服务器的上传下载 string fileName = fileNamePath.Substring(fileNamePath.LastIndexOf("\\") + 1); NewFileName = DateTime.Now.ToString("yyMMddhhmmss") + DateTime.Now.Millisecond.ToString() +...
  • 这是本人在工作中收藏的开发工具包,该文档封装了文件上传下载,删除的操作,你只需要在前台调用方法即可完成文件上传下载与删除,绝对是你学习asp.net的好帮手,而且可以作为你的开发工具包
  • java文件上传下载.ppt
  • SpringBoot大文件上传下载、分片、断点续传、代码实现

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 727,851
精华内容 291,140
关键字:

文件上传下载

友情链接: SearchPDF1.0.zip