Java中使用jcifs庫操作SMB協議進行檔案操作

djπ發表於2024-10-11

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

相關文章