最近需要将原来使用阿里云 OSS 的程序模块改成使用公司内部搭建的文件服务器,由于目前使用的文件不多,且都是一些小文件,经过对比后,决定采用 Samba 来实现文件服务器。
Samba 是一个程序的集合,包括服务器与客户端程序,它允许在 Linux 与 Windows 实现共享文件的功能。本文先讲述如何在 CentOS 7 下安装与配置 Samba,然后讲述如何使用 Java 来实现 Samba 客户端以上传与读取文件。
Samba 安装
CentOS 平台下可以直接使用 yum 来安装 Samba 服务器以及客户端。
Samba 安装好后,就可以启动操作。
如果需要关闭,则使用命令:
如果需要查看 smb 运行状态,可以使用命令:
Samba 配置
安装好 Samba 后,就可以对 Samba 进行配置了。
我们先使用以下命令添加 Linux 组 leehao 和用户 leehao。
接下来使用smbpasswd
命令来创建 Samba 的用户:
输入 Samba 用户 leehao 的密码。
Samba 的默认配置文件是/etc/samba/smb.conf
。打开 smb.conf 文件,添加以下配置:
1 2 3 4 5 6 7 8 9
| [portrait] comment = leehao portrait path = /home/leehao/upload/portrait valid users = @leehao public = no admin users = leehao writable = yes create mask = 0640 directory mask = 0750
|
配置的含义是增加一个新的 Samba 共享目录,目录位置是/home/leehao/upload/portrait
,且使用需要使用指定用户密码来访问。
在/home/leehao/
目录下创建目录upload/portrai
。
完成配置后,可以使用testparm
命令来测试 Samba 配置是否正常。
Windows 访问 Samba
Samba 配置完成后,就可以访问了,可以在 Windows 打开文件资源窗口来访问 Samba。
Windows 窗口地址栏中输入\\10.88.x.x\portrait
(改成实际 IP),按下回车,输入用户 leehao 和上面设置的密码,就可以访问 Linux 的 Samba 目录了。
如果弹出“不允许一个用户使用一个以上用户名与服务器…”提示,可以打开 cmd,输入net use * /del /y
命令,断开所有 Windows 与 Samba 的连接,再重新连接 Samba 即可。
Java 实现 Samba 客户端
我们使用 jcifs 来实现 Java 读取以及下载 Samba 文件的功能。
pom.xml 文件引入 jcifs:
1 2 3 4 5
| <dependency> <groupId>jcifs</groupId> <artifactId>jcifs</artifactId> <version>1.3.17</version> </dependency>
|
完整的代码如下:
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
| import java.io.FileInputStream; import java.io.FileOutputStream;
import jcifs.UniAddress; import jcifs.smb.NtlmPasswordAuthentication; import jcifs.smb.SmbFile; import jcifs.smb.SmbSession;
import org.apache.commons.io.IOUtils;
public class App { private String ip = "x.x.x.x"; private int port = 139; private String user = "leehao"; private String passwd = "xxxxxx";
public void testPut() { try { UniAddress ua = UniAddress.getByName(ip); NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(ip, user, passwd); SmbSession.logon(ua, port, auth); SmbFile sf = new SmbFile("smb://" + ip + "/portrait/upload.txt", auth); IOUtils.copyLarge(new FileInputStream("f:/upload.txt"), sf.getOutputStream()); } catch (Exception e) { e.printStackTrace(); } }
public void testGet() { try { UniAddress ua = UniAddress.getByName(ip); NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(ip, user, passwd); SmbSession.logon(ua, port, auth); SmbFile sf = new SmbFile("smb://" + ip + "/portrait/upload.txt", auth); IOUtils.copyLarge(sf.getInputStream(), new FileOutputStream("f:/download.txt")); } catch (Exception e) { e.printStackTrace(); } }
public static void main(String[] args) { App app = new App();
app.testGet(); } }
|
代码提供上传以下下载 Samba 文件的功能。
参考资料
- https://www.samba.org/
- https://www.samba.org/samba/docs/SambaIntro.html
- http://www.cnblogs.com/mchina/archive/2012/12/18/2816717.html
- https://www.cnblogs.com/fangfan/p/4000094.html