zoukankan      html  css  js  c++  java
  • FastDFS实现文件上传下载实战

    正好,淘淘商城讲这一块的时候,我又想起来当时老徐让我写过一个关于实现FastDFS实现文件上传下载的使用文档,当时结合我们的ITOO的视频系统和毕业论文系统,整理了一下,有根据网上查到的知识,总结了一点东西,下面分享一下

    一、FastDFS简介:

            参见博客:http://blog.csdn.NET/liweizhong193516/article/details/53234486

    二、FastDFS使用流程介绍:        

           我们在itoo的dobbu+zk框架中使用fastdfs+nginx+MySQL实现上传附件的功能,主要原理就是将附件上传到fastdfs得到一个文件的链接路径url,我们获取到这个url将他以字符串形式保存到我们的mysql中,下载的时候获取到这个url直接打开或者下载附件。(url内容参见博客:http://blog.csdn.Net/liweizhong193516/article/details/52556526)

                   

                   

            默认的,我们就知道fastdfs后面还有一个nginx服务器,当我们进行存储文件的时候,我们要通过fastdfs给我们生成一个保存地址,也就是grounpID 和保存地址,然后将文件已key-value方式存进nginx服务器中;当我们进行读取文件的时候,我们要通过获取mysql里面的相应文件的存储地址去nginx服务器中通过key,去取出我们的文件进行展示。(所以下载图,有点问题,在这里解释一下)

    三、实现流程:

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

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
    2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    
    3.     <modelVersion>4.0.0</modelVersion>     
    4.     <groupId>com.leech</groupId>    
    5.     <artifactId>fastdfs-demo</artifactId>    
    6.     <version>0.0.1-SNAPSHOT</version>    
    7.     <packaging>jar</packaging>     
    8.     <name>fastdfs-demo</name>    
    9.     <url>http://maven.apache.org</url>     
    10.     <properties>      
    11.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    
    12.     </properties>     
    13.       
    14.     <dependencies>      
    15.         <dependency>        
    16.             <groupId>junit</groupId>        
    17.             <artifactId>junit</artifactId>        
    18.             <version>4.11</version>        
    19.             <scope>test</scope>      
    20.         </dependency>           
    21.         <dependency>        
    22.             <groupId>org.csource</groupId>        
    23.             <artifactId>fastdfs-client-java</artifactId>        
    24.             <version>1.25</version>      
    25.         </dependency>           
    26.         <dependency>          
    27.             <groupId>commons-io</groupId>          
    28.             <artifactId>commons-io</artifactId>          
    29.             <version>2.4</version>      
    30.             </dependency>         
    31.         </dependencies>  
    32.     </project>  

    当然,更多时候我们利用maven的继承特性,直接配置在父工程中,然后继承下来就o了。

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

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. connect_timeout = 2  
    2. network_timeout = 30  
    3. charset = UTF-8  
    4. http.tracker_http_port = 80   
    5. #没什么用  
    6. http.anti_steal_token = no  
    7. http.secret_key = FastDFS1234567890  
    8. tracker_server = 192.168.17.112:22122   
    9. #tracker_server = 192.168.0.119:22122  

    3、实现文件上传:

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1.       public void save(HttpServletRequest request,HttpServletResponse response){          
    2.     String videoName=request.getParameter("videoName");  
    3.     String videoType=request.getParameter("videoType");  
    4.     String videoDesc=request.getParameter("videoDesc");  
    5.     String videoPath=request.getParameter("videoPath");  
    6.     String picturePath=request.getParameter("picturePath");  
    7.   
    8.     SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    9.     Date uploadTime=null;  
    10.     try {  
    11.         uploadTime = formatter.parse(formatter.format(new Date()));  
    12.     } catch (ParseException e) {  
    13.         // TODO Auto-generated catch block  
    14.         e.printStackTrace();  
    15.     }  
    16.       
    17.     JacksonJsonUntil jackJsonUtil =new JacksonJsonUntil ();  
    18.       
    19.     String dataBaseName = "itoo_video";  
    20.   
    21.     Video video=new Video();  
    22.     video.setUserName("why");  
    23.     video.setUserID("why");       
    24.     video.setVideoName(videoName);  
    25.     video.setVideoPath(videoPath);  
    26.     video.setVideoType(videoType);  
    27.     video.setVideoDesc(videoDesc);    
    28.     video.setDataBaseName(dataBaseName);  
    29.     video.setPicturePath(picturePath);  
    30.     video.setUploadTime(uploadTime);  
    31.       
    32.     uploadFileService.save(video);        
    33.       
    34.        jackJsonUtil.beanToJson(response,video);  
    35.       
    36. }  
    37.   
    38. /* 
    39.  * 上传文件 
    40.  */  
    41. @RequestMapping(value={"/upload"})  
    42. @ResponseBody  
    43. public void upload( MultipartFile file, HttpServletRequest request,HttpServletResponse response){         
    44.       
    45.     String ext_Name = file.getOriginalFilename().split("\.")[1];  
    46.     String videoName=file.getOriginalFilename().split("\.")[0];  
    47.       
    48.        byte[] bytes = null;  
    49.     try {  
    50.         bytes = file.getBytes();  
    51.     } catch (IOException e) {  
    52.         e.printStackTrace();  
    53.     }  
    54.     String videoPath=uploadFile(bytes,ext_Name);  
    55.       
    56.     JacksonJsonUntil jackJsonUtil =new JacksonJsonUntil ();  
    57.       
    58.     Video video=new Video();  
    59.     video.setVideoPath(videoPath);  
    60.     video.setVideoName(videoName);        
    61.       
    62.     jackJsonUtil.beanToJson(response,video);  
    63. }   
    64.   
    65. public String uploadFile(byte[] byteFile, String ext_file) {  
    66.     // 拼接服务区的文件路径  
    67.     StringBuffer sbPath = new StringBuffer();  
    68.     sbPath.append("http://192.168.22.252");  
    69.     try {  
    70.         // 初始化文件资源  
    71.         ClientGlobal  
    72.                 .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");  
    73.   
    74.         // 链接FastDFS服务器,创建tracker和Stroage  
    75.         TrackerClient trackerClient = new TrackerClient();  
    76.         TrackerServer trackerServer = trackerClient.getConnection();  
    77.         StorageServer storageServer = null;  
    78.         StorageClient storageClient = new StorageClient(trackerServer,  
    79.                 storageServer);  
    80.         //利用字节流上传文件  
    81.         String[] strings = storageClient.upload_file(byteFile, ext_file, null);  
    82.   
    83.         for (String string : strings) {  
    84.             sbPath.append("/" + string);  
    85.             System.out.println(string);  
    86.         }  
    87.         // 全路径  
    88.         System.out.println(sbPath);  
    89.     } catch (IOException | MyException e) {  
    90.         e.printStackTrace();  
    91.     }  
    92.     return sbPath.toString();  
    93. }  

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

    4、FastDFS实现文件下载:

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public void testDownload() {          
    2.         try {               
    3.             ClientGlobal.init(conf_filename);               
    4.             TrackerClient tracker = new TrackerClient();               
    5.             TrackerServer trackerServer = tracker.getConnection();              
    6.             StorageServer storageServer = null;               
    7.             StorageClient storageClient = new StorageClient(trackerServer, storageServer);               
    8.             byte[] b = storageClient.download_file("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");               
    9.             System.out.println(b);               
    10.             IOUtils.write(b, new FileOutputStream("D:/"+UUID.randomUUID().toString()+".conf"));          
    11.             }   
    12.         catch (Exception e) {               
    13.             e.printStackTrace();           
    14.         }       
    15.     }         

    5、FastDFS获取将上传文件信息:

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public void testGetFileInfo(){           
    2.         try {               
    3.             ClientGlobal.init(conf_filename);               
    4.             TrackerClient tracker = new TrackerClient();               
    5.             TrackerServer trackerServer = tracker.getConnection();               
    6.             StorageServer storageServer = null;               
    7.             StorageClient storageClient = new StorageClient(trackerServer, storageServer);               
    8.             FileInfo fi = storageClient.get_file_info("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");               
    9.             System.out.println(fi.getSourceIpAddr());             System.out.println(fi.getFileSize());               
    10.             System.out.println(fi.getCreateTimestamp());             System.out.println(fi.getCrc32());           
    11.             }     
    12.         catch (Exception e) {               
    13.             e.printStackTrace();           
    14.             }       
    15.         }         

    6、FastDFS获取文件名称:

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public void testGetFileMate(){           
    2.         try {              
    3.             ClientGlobal.init(conf_filename);               
    4.             TrackerClient tracker = new TrackerClient();               
    5.             TrackerServer trackerServer = tracker.getConnection();               
    6.             StorageServer storageServer = null;               
    7.             StorageClient storageClient = new StorageClient(trackerServer,                       
    8.             storageServer);               
    9.             NameValuePair nvps [] = storageClient.get_metadata("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");               
    10.             for(NameValuePair nvp : nvps){                   
    11.                 System.out.println(nvp.getName() + ":" + nvp.getValue());              
    12.                 }           
    13.             }   
    14.         catch (Exception e) {               
    15.             e.printStackTrace();           
    16.             }       
    17.     }      

    7、FastDFS实现删除文件:

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
      1.           public void testDelete(){           
      2. try {               
      3.     ClientGlobal.init(conf_filename);               
      4.     TrackerClient tracker = new TrackerClient();               
      5.     TrackerServer trackerServer = tracker.getConnection();               
      6.     StorageServer storageServer = null;               
      7.     StorageClient storageClient = new StorageClient(trackerServer,storageServer);               
      8.     int i = storageClient.delete_file("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");               
      9.     System.out.println( i==0 ? "删除成功" : "删除失败:"+i);           
      10.     }   
      11. catch (Exception e) {               
      12.     e.printStackTrace();           
      13.     }       
      14.           }  
  • 相关阅读:
    Java的运行机制
    java小项目之:植物大战僵尸,这个僵尸有点冷!内附素材源码
    学习Java必须避开的十大致命雷区,千万不要踩!
    教你从零开始学习java正则表达式!
    java小项目之:扫雷,这游戏没有你想的那么简单!
    CentOS 旧版下载地址
    yum相关变量浅析
    在 CentOS 中部署 KMS 服务器(vlmcsd)
    CentOS 6.x 重置root 密码
    1-VCP 框架
  • 原文地址:https://www.cnblogs.com/DoubleEggs/p/6083465.html
Copyright © 2011-2022 走看看