Java中使用jcifs库操作SMB协议进行文件操作

简介
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服务器地址和文件路径正确。
处理好异常情况,例如文件不存在或网络问题。
在生产环境中,不要将用户名和密码硬编码在代码中,而应使用配置文件或环境变量。

posted @   djπ  阅读(324)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示