簡介
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伺服器地址和檔案路徑正確。
處理好異常情況,例如檔案不存在或網路問題。
在生產環境中,不要將使用者名稱和密碼硬編碼在程式碼中,而應使用配置檔案或環境變數。