今天的越写悦快乐之系列文章为大家带来Spring Boot项目如何连接Samba服务。作为一名爱做梦的码农来说,探索未知的领域并应用是我们不懈的追求,当然这些应用也需要建立在特定的场景下才能发挥潜能,也更能通过产品或服务满足客户的需求,接下来我们通过Samba来构建我们的文件服务,通过它可以快速读写文件,接下来让我们来看看。
Samba是一个应用于Linux和Unix的Windows应用程序套件,它为所有使用SMB/CIFS协议的客户机提供了安全、稳定和快速的文件和打印服务。
开发环境
- Window 10.0.17763
- IntelliJ IDEA 2019.1
- Spring Boot 2.3.7
创建Samba服务
为了能快速创建Samba服务,我们在Linux主机上使用Docker来进行相关操作
Linux下Docker的安装请自行搜索
拉取镜像
我们通过SSH连接Linux服务器,然后在终端软件Xshell中执行以下命令:
docker pull dperson/samba
创建映射目录
mkdir -p /home/docker/samba/data
启动镜像
在启动容器的时候需要指定工作目录、连接Samba的账号和密码、映射目录的读写规则,具体的启动命令如下:
docker run -it --name samba -p 139:139 -p 445:445 -v /home/docker/samba/data:/home/shares/shareA -d dperson/samba -w "WORKGROUP" -u "smbuser;123456789" -s "shareA;/home/shares/shareA;yes;no;no;smbuser;smbuser;smbuser"
可以通过
docker ps -a
查看Samba容器服务是否启动
接入步骤
创建项目
我们使用IntelliJ IDEA创建项目samba-tour
,然后引入jcifs
依赖,Maven的配置文件参考以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>me.weitao.app</groupId>
<artifactId>samba-tour</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>samba-tour</name>
<description>Samba Tour for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<jcifs.version>2.1.22</jcifs.version>
</properties>
<repositories>
<repository>
<id>AliYun Nexus</id>
<name>AliYun Nexus</name>
<url>https://maven.aliyun.com/nexus/content/repositories/central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>AliYun Nexus</id>
<name>AliYun Nexus</name>
<url>https://maven.aliyun.com/nexus/content/repositories/central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.codelibs/jcifs -->
<dependency>
<groupId>org.codelibs</groupId>
<artifactId>jcifs</artifactId>
<version>${jcifs.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
编写测试文件
随后我们查看一下项目的结果,如下图所示:
项目结构 - 图片来自我的手机在SambaTourApplicationTests
文件中编写读写文件的函数,可参考一下内容:
package me.weitao.app;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.*;
@SpringBootTest
@Slf4j
class SambaTourApplicationTests {
public static void smbGet(String remoteUrl, String localDir) {
System.out.println("进入 smbGet() ....");
InputStream in = null;
OutputStream out = null;
try {
SmbFile remoteFile = new SmbFile(remoteUrl);
System.out.println(remoteFile.exists());
System.out.println(remoteFile.canRead());
System.out.println(remoteFile.canWrite());
System.out.println("尝试连接 远程文件 ....");
if (remoteFile.exists()) {
log.info("找到文件....");
String fileName = remoteFile.getName();
File localFile = new File(localDir + "\\" + fileName);
in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
out = new BufferedOutputStream(new FileOutputStream(localFile));
byte[] buffer = new byte[1024];
while (in.read(buffer) != -1) {
out.write(buffer);
buffer = new byte[1024];
}
} else {
log.info(remoteUrl + "文件不存在!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void smbPut(String remoteUrl, String localFilePath) {
InputStream in = null;
OutputStream out = null;
try {
File localFile = new File(localFilePath);
String fileName = localFile.getName();
SmbFile remoteFile = new SmbFile(remoteUrl + "/" + fileName);
in = new BufferedInputStream(new FileInputStream(localFile));
out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));
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();
out = null;
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Test
void contextLoads() {
// smbGet("smb://smbuser:123456789@192.168.8.192/shareA/def.txt", "F:/shareA");
// smbPut("smb://smbuser:123456789@192.168.8.192/shareA", "F:\\shareA\\def.txt");
}
}
shareA
是我们Docker启动时的映射路径
smbuser:123456789
是我们连接Samba的账号和密码
192.168.8.192
是我们的Linux主机的IP地址
创建测试文件
在执行测试函数之前,我们需要在shareA
目录下创建文件def.txt
,并写入以下内容:
welcome to samba
查看结果
随后我们执行测试函数,调用smbPut方法并传入需要连接的Samba信息,以及本地文件路径,执行结果如下图所示:
执行结果 - 图片来自我的手机验证结果
随后我们按下Windows + R并输入\\192.168.8.192
,如果出现你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问
的警告,请参考这篇文章来解决,随后我们再次输入\\192.168.8.192
提示我们输入身份验证信息,输入我们在Samba容器启动时配置的账号和密码,在shareA
目录中可以看到刚才执行测试的文件了。
参考
个人收获及总结
文件系统作为一个产品的常用服务,可以快速搭建基础服务,当然这些基础设施需要我们根据实际业务去梳理和调整,通过不断地优化和打磨才能让我们的产品和服务更上一层楼,也希望我们能为互联网的发展贡献自己的一份力量,让我们一起构建自己的核心竞争力。若是我的文章对你有所启发,那将是我莫大的荣幸。希望和您一起精进,成为更好的自己。
网友评论