简介
SMB是一种网络通信协议,用于计算机在网络上进行文件共享、打印服务以及其他资源的共享。jcifs是一个纯Java实现的SMB客户端库,它允许Java应用程序访问SMB共享资源。
环境准备
在开始之前,确保你的项目中已经添加了jcifs库的依赖。如果使用Maven,可以在pom.xml文件中添加以下依赖:
xml
<dependency>
<groupId>jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.19</version>
</dependency>
示例代码
下面是一个使用jcifs库从SMB服务器读取文件并获取其二进制数据的示例代码:
java
package com.csot.kms.common.poi;
import cn.hutool.core.img.ImgUtil;
import com.csot.kms.common.valid.MyException;
import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import lombok.extern.slf4j.Slf4j;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
@Slf4j
public class MyJcifsUtil {
/**
* 读取文件,获取二进制数据
*
* @param filePath 文件路径
* @param fileName 文件名
* @return 文件的二进制数据
*/
public static byte[] smbGetFileByte(String filePath, String fileName) {
String username = "888";
String password = "888";
String server = "888.com";
String fileUrl = "smb://" + username + ":" + password + "@" + server + "/" + filePath + "/" + fileName;
log.info("=================文件地址:{}", fileUrl);
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", username, password);
try {
SmbFile smbFile = new SmbFile(fileUrl, auth);
smbFile.connect();
if (smbFile.exists()) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
InputStream inputStream = smbFile.getInputStream();
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
byte[] fileData = outputStream.toByteArray();
return fileData;
} else {
throw new MyException("文件不存在", fileUrl);
}
} catch (MalformedURLException | SmbException e) {
String msg = "错误原因:" + e.getMessage();
log.info(msg);
throw new MyException(msg);
} catch (IOException e) {
String msg = "错误原因:" + e.getMessage();
log.info(msg);
throw new MyException(msg);
}
}
public static void main(String[] args) throws IOException {
String imgPath = "D:\\dj\\push.jpg";
String imgPath2 = "D:\\dj\\Rectangle2.png";
File imageFile = new File(imgPath);
BufferedImage image = ImageIO.read(imageFile);
String jpg = ImgUtil.toBase64(image, ImgUtil.IMAGE_TYPE_JPG);
log.info("===========:{}", jpg);
}
}
代码解释
配置SMB连接信息:包括用户名、密码、服务器地址和文件路径。
创建SMB文件URL:使用用户名、密码、服务器地址和文件路径构建SMB文件URL。
创建NtlmPasswordAuthentication对象:用于认证。
创建SmbFile对象并连接:通过SMB URL和认证信息创建SmbFile对象,并连接到SMB服务器。
检查文件是否存在:如果文件存在,读取文件内容到ByteArrayOutputStream中。
读取文件内容:使用InputStream读取文件内容,并将其写入ByteArrayOutputStream。
获取二进制数据:从ByteArrayOutputStream中获取文件的二进制数据。
注意事项
确保SMB服务器地址和文件路径正确。
处理好异常情况,例如文件不存在或网络问题。
在生产环境中,不要将用户名和密码硬编码在代码中,而应使用配置文件或环境变量。