<实战> 用java 代码下载Samba服务器上的文件到本地目录以及上传本地文件到Samba服务器

简介:

引入:

在我们昨天架设好了Samba服务器上并且创建了一个 Samba 账户后,我们就迫不及待的想用JAVA去操作Samba服务器了,我们找到了一个框架叫 jcifs,可以高效的完成我们工作。


实践:

对samba服务器上的操作无外乎2种:一种是从Samba服务器上下载某文件到本地目录,一种是上传本地文件到Samba服务器上指定目录,为此我们写了一个工具类,来完成这两件事情。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package  com.charles.study;
import  java.io.BufferedInputStream;
import  java.io.BufferedOutputStream;
import  java.io.File;
import  java.io.FileInputStream;
import  java.io.FileOutputStream;
import  java.io.IOException;
import  java.io.InputStream;
import  java.io.OutputStream;
import  jcifs.smb.SmbFile;
import  jcifs.smb.SmbFileInputStream;
import  jcifs.smb.SmbFileOutputStream;
/**
  * 这个工具类提供了从Samba服务器上下载文件到本地目录,以及上传本地文件到Samba服务器指定目录的方法
  * @author charles.wang
  *
  */
public  class  SambaFileAccessUtil {
            
     private  SambaFileAccessUtil() {}
            
     /**
      * 从samba服务器上下载指定的文件到本地目录
      * @param remoteFileURL   Samba服务器远程文件的路径
      * @param localDir        本地目录的路径
      */
            
     public  static  void  downloadFileFromSamba(String remoteFileURL, String localDir){
                
         //入参检查
         if  (  (remoteFileURL== null ) || ( "" .equals(remoteFileURL.trim()))){
             System.out.println( "Samba服务器远程文件路径不可以为空" );
             return ;
         }
         //入参检查
         if ( (localDir== null ) || ( "" .equals(localDir.trim()))){
             System.out.println( "本地目录路径不可以为空" );
             return ;
         }
                
         InputStream in =  null ;
         OutputStream out =  null ;
                
         try {
             //创建一个smbFile对象对应远程服务器上的SmbFile
             SmbFile remoteSmbFile =  new  SmbFile(remoteFileURL);
                    
             //获取远程文件的文件名,这个的目的是为了在本地的目录下创建一个同名文件
             String remoteSmbFileName = remoteSmbFile.getName();
                    
             //本地文件由本地目录,路径分隔符,文件名拼接而成
             File localFile =  new  File(localDir+File.separator+remoteSmbFileName);
                    
             //打开文件输入流,指向远程的smb服务器上的文件,特别注意,这里流包装器包装了SmbFileInputStream
             in=  new  BufferedInputStream( new  SmbFileInputStream(remoteSmbFile));
             //打开文件输出流,指向新创建的本地文件,作为最终复制到的目的地
             out =  new  BufferedOutputStream( new  FileOutputStream(localFile));
                    
             //缓冲内存
             byte [] buffer =  new  byte [ 1024 ];
             while  (in.read(buffer) != - 1 ){
                 out.write(buffer);
                 buffer =  new  byte [ 1024 ];
             }     
                    
         } catch  (Exception e){
             e.printStackTrace();
                    
         } finally {
             try   {
                 out.close();
                 in.close();
             catch   (IOException e) {
                 e.printStackTrace();
             }
         }
     }
            
            
     /**
      * 上传本地文件到Samba服务器指定目录
      * @param remoteDirURL  Samba服务器远程目录的路径
      * @param localFilePath 本地文件路径
      */
     public  static  void  uploadFileToSamba(String remoteDirURL,String localFilePath){
                
         //入参检查
         if  (  (remoteDirURL== null ) || ( "" .equals(remoteDirURL.trim()))){
             System.out.println( "Samba服务器远程目录路径不可以为空" );
             return ;
         }
                
         //入参检查
         if ( (localFilePath== null ) || ( "" .equals(localFilePath.trim()))){
             System.out.println( "本地文件路径不可以为空" );
             return ;
         }
                
         InputStream in =  null ;
         OutputStream out =  null ;
                
         try {
             //创建一个本地文件对象
             File localFile =  new  File(localFilePath);
                    
             //获取本地文件的文件名,这个名字用于在远程的Samba服务器上指定目录创建同名文件
             String localFileName = localFile.getName();
                    
             //创建远程服务器上Samba文件对象
             SmbFile remoteSmbFile =  new  SmbFile(remoteDirURL+File.separator+localFileName);
                    
             //打开一个文件输入流执行本地文件,要从它读取内容
             in =  new   BufferedInputStream(  new   FileInputStream(localFile));
                    
             //打开一个远程Samba文件输出流,作为复制到的目的地
             out =  new   BufferedOutputStream(  new   SmbFileOutputStream(remoteSmbFile));
                    
             //缓冲内存
             byte  [] buffer =   new    byte  1024  ];
             while   (in.read(buffer) != -  1  ) {
                 out.write(buffer);
                 buffer =  new  byte 1024  ];
             }
                    
         catch   (Exception e) {
             e.printStackTrace();
                    
         finally   {
             try   {
                 out.close();
                 in.close();
             catch   (IOException e) {
                 e.printStackTrace();
             }
         }
                
     }
}

为了验证我们的正确性,我们写了某测试类。


测试1: 从Samba服务器上下载某文件到本地。

我们先做好准备工作,因为Samba服务器上多半是存图片等资源文件的,所以我们也以图片为例。

我们在Samba服务器的/home/samba/目录下新建一个子目录叫demo1,并且放上去一个图片叫testFile1.jpg,这个文件作为我们要从Samba服务器上下载的目标文件:

111204391.png


然后我们在本地的D:\Framework Study\Samba\DemoTest下创建一个子目录叫demo1,这里作为最终的要下载到本地的目录:

111309374.png


我们运行如下DEMO代码:

1
2
3
4
5
//Demo1: 演示从Samba服务器上下载指定的文件到本地
         System.out.println( "Demo1: Downloading File from Samba Server to Local" );
         String demo1RemoteSambaFileURL=  "smb://samba:samba_password@192.168.71.43/samba/demo1/testFile1.jpg" ;
         String demo1LocalDir =  "D:\\Framework Study\\Samba\\DemoTest\\demo1" ;
         SambaFileAccessUtil.downloadFileFromSamba(demo1RemoteSambaFileURL, demo1LocalDir);


这里注意,我们的Samba服务器上的远程文件URL必须是smb协议开头,因为我们对于samba目录加了访问控制,所以要<username>:<password>@<ip>/<path>的形式,否则,可以吧<username>:<password>去掉。


运行完之后,果然该图片文件被复制到了本地:

111904431.png



测试2:上传本地文件到Samba服务器指定目录

我们同样做好准备工作,我们在本地的D:\Framework Study\Samba\DemoTest下创建一个子目录叫demo2,并且放置一个图片叫testFile2.jpg,这个文件作为要上传到Samba服务器的原始文件:

112125166.png


然后我们在Samba服务器的/home/samba/目录下新建一个子目录叫demo2,这个目录作为我们要上传到的Samba服务器的目录:

112552843.png


我们运行如下的DEMO代码:

1
2
3
4
5
//Demo2: 演示上传文件到Samba服务器指定目录
         System.out.println( "Demo2:Uploading File from Local to Samba Server" );
         String demo2RemoteSambaDirURL= "smb://samba:samba_password@192.168.71.43/samba/demo2" ;
         String demo2LocalFile=  "D:\\Framework Study\\Samba\\DemoTest\\demo2\\testFile2.jpg" ;
         SambaFileAccessUtil.uploadFileToSamba(demo2RemoteSambaDirURL, demo2LocalFile);


运行完之后,果然这个testFile2.jpg被上传到了Samba服务器:

112753600.png



总结:

其实用samba来作为windows和unix类系统之间文件共享的桥梁还是挺方便的,类似unix之间的scp(jsch框架可以完成这件事情) ,其实方法都一样。这里有2个注意点:

(1)在写samba url时候,如果目标目录是一个需要特定账号密码才能访问的,那么这个url pattern为

smb://<samba username>:<samba userpassword>@<samba server ip>/<subpath>,如果某个目录是public的(设了guest ok的),那么url pattern是 smb://<samba server ip>/<subpath>

(2) 这里只提供了上传下载单文件的方法,如果要批上传下载或者操作目录,请递归或者循环调用上面工具类的方法。





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1344301,如需转载请自行联系原作者
目录
相关文章
|
11天前
|
Java 测试技术 应用服务中间件
常见 Java 代码缺陷及规避方式(下)
常见 Java 代码缺陷及规避方式(下)
32 0
|
13天前
|
Java
Java中ReentrantLock释放锁代码解析
Java中ReentrantLock释放锁代码解析
25 8
|
4天前
|
存储 Java 数据库连接
java DDD 领域驱动设计思想的概念与实战
【4月更文挑战第19天】在Java开发中,领域驱动设计(Domain-Driven Design, DDD) 是一种软件设计方法论,强调以领域模型为中心的软件开发。这种方法通过丰富的领域模型来捕捉业务领域的复杂性,并通过软件满足核心业务需求。领域驱动设计不仅是一种技术策略,而且还是一种与业务专家紧密合作的思维方式
21 2
|
11天前
|
Java
代码的魔法师:Java反射工厂模式详解
代码的魔法师:Java反射工厂模式详解
23 0
|
11天前
|
监控 安全 Java
常见 Java 代码缺陷及规避方式(中)
常见 Java 代码缺陷及规避方式(中)
23 1
|
13天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
14 0
|
29天前
|
Ubuntu JavaScript 关系型数据库
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
在阿里云Ubuntu 20.04服务器上部署Ghost博客的步骤包括创建新用户、安装Nginx、MySQL和Node.js 18.x。首先,通过`adduser`命令创建非root用户,然后安装Nginx和MySQL。接着,设置Node.js环境,下载Nodesource GPG密钥并安装Node.js 18.x。之后,使用`npm`安装Ghost-CLI,创建Ghost安装目录并进行安装。配置过程中需提供博客URL、数据库连接信息等。最后,测试访问前台首页和后台管理页面。确保DNS设置正确,并根据提示完成Ghost博客的配置。
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
|
1月前
|
存储 弹性计算 数据可视化
要将ECS中的文件直接传输到阿里云网盘与相册(
【2月更文挑战第31天】要将ECS中的文件直接传输到阿里云网盘与相册(
415 4
|
1月前
|
SQL 弹性计算 安全
购买阿里云活动内云服务器之后设置密码、安全组、增加带宽、挂载云盘教程
当我们通过阿里云的活动购买完云服务器之后,并不是立马就能使用了,还需要我们设置云服务器密码,配置安全组等基本操作之后才能使用,有的用户还需要购买并挂载数据盘到云服务器上,很多新手用户由于是初次使用阿里云服务器,因此并不知道这些设置的操作流程,下面给大家介绍下这些设置的具体操作流程。
购买阿里云活动内云服务器之后设置密码、安全组、增加带宽、挂载云盘教程
|
18天前
|
弹性计算
阿里云ECS使用体验
在申请高校学生免费体验阿里云ECS云服务器后的一些使用体验和感受。