Linux下smb服务搭建与Java开发smb协议相关接口实现
一、Linux下搭建smb服务
1、安装服务 # yum install samba samba-common -y # useradd -s /sbin/nologin george --创建samba服务登录用户 # smbpasswd -a george --将用户 george 设置为smb用户,并增加密码;修改密码时不用加 -a 参数,george必须是系统已经拥有的用户 # smbpasswd -x u1 --删除用户 # smbpasswd -d u1 --禁用用户 # smbpasswd -e u1 --启用用户 # pdbedit -L --列出所有用户 # pdbedit -Lv --列出所有用户的详细信息 # pdbedit -Lv george --列出用户 george 的详细信息 2、配置文件 /etc/samba/smb.conf #######在最下端添加 [share] --共享名称 path = /share --共享路径 write list = harry --指定可以读写的用户 3、重启服务 service smb restart
二、smb.conf示例
[global] display charset = UTF8 dos charset = cp950 unix charset = UTF8 log file = /var/log/samba/log.%m max log size = 50 security = user map to guest = Bad User passdb backend = tdbsam load printers = no username map = /etc/samba/smbusers [printers] comment = All Printers path = /var/tmp printable = Yes create mask = 0600 browseable = No [print$] comment = Printer Drivers path = /var/lib/samba/drivers write list = @printadmin root force group = @printadmin create mask = 0664 directory mask = 0775 [v213735532343] comment=export of v213735532343 path=/nfs/v213735532343 writable=yes browseable=no posix locking=no valid users=%U hide unreadable = yes
三、Java开发smb协议相关接口
1.在pom.xml文件夹中添加如下的依赖
<dependency>
       <groupId>jcifs</groupId>
       <artifactId>jcifs</artifactId>
       <version>1.3.17</version>
</dependency>
2.交互代码
import jcifs.smb.*;
import java.io.*;
import java.net.MalformedURLException;
/**
 * @program: smbTest
 * @description:
 * @author:hw
 * @create: 2020-10-09 16:40
 */
public class SmbTest {
    public static void main(String[] args) {
        //smb访问的基本格式:smb:域名;用户名:密码@目的IP/文件夹/文件名.xxx
        //如果密码中有“@”这种特殊字符导致无法识别,需要采用NtlmPasswordAuthentication登录认证
//        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("192.168.212.232", "hwtest", "123456"); // 先登录验证
//        SmbFile smbFile = new SmbFile(remoteUrl,auth);
        String remoteUrl = "smb://hwtest:123456@192.168.212.232/hwtest/";
        //创建文件夹
        smbMkdir(remoteUrl,"test");
        //读取共享文件夹下的所有文件(文件夹)的名称
//        remoteUrl = remoteUrl + "test/";
//        getSharedFileList(remoteUrl);
        //上传文件
//        String shareFolderPath = "test";
//        String localFilePath = "C:\\Users\\Administrator\\Desktop\\51.png";
//        String fileName = "1.png";
//        uploadFileToSmb(remoteUrl,shareFolderPath,localFilePath,fileName);
        //下载文件到指定文件夹
//        String shareFolderPath = "test";
//        String fileName = "1.png";
//        String localDir = "C:\\Users\\Administrator\\Desktop";
//        downloadFileToFolder(remoteUrl,shareFolderPath,fileName,localDir);
        //删除文件
//        String shareFolderPath = "test";
//        String fileName = "1.png";
//        deleteFile(remoteUrl,shareFolderPath,fileName);
    }
    /**
    * @Description: 创建文件夹
    * @Param:
    * @return:
    * @throws Exception
    * @author: hw
    * @date: 2020/10/9 16:51
    */
    public static void smbMkdir(String remoteUrl, String folderName) {
        SmbFile smbFile;
        try {
            // smb://userName:passWord@host/path/folderName
            smbFile = new SmbFile(remoteUrl + folderName);
            if (!smbFile.exists()) {
                smbFile.mkdir();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (SmbException e) {
            e.printStackTrace();
        }
    }
    /**
     * @Description: 读取共享文件夹下的所有文件(文件夹)的名称
     * @Param:
     * @return:
     * @throws Exception
     * @author: hw
     * @date: 2020/10/9 16:42
     */
    public static void getSharedFileList(String remoteUrl) {
        SmbFile smbFile;
        try {
            // smb://userName:passWord@host/path/
            smbFile = new SmbFile(remoteUrl);
            if (!smbFile.exists()) {
                System.out.println("no such folder");
            } else {
                SmbFile[] files = smbFile.listFiles();
                for (SmbFile f : files) {
                    System.out.println(f.getName());
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (SmbException e) {
            e.printStackTrace();
        }
    }
    /**
    * @Description: 上传文件
    * @Param:
    * @return:
    * @throws Exception
    * @author: hw
    * @date: 2020/10/9 17:21
    */
    public static void uploadFileToSmb(String remoteUrl, String shareFolderPath, String localFilePath, String fileName) {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            File localFile = new File(localFilePath);
            inputStream = new FileInputStream(localFile);
            // smb://userName:passWord@host/path/shareFolderPath/fileName
            SmbFile smbFile = new SmbFile(remoteUrl + shareFolderPath + "/" + fileName);
            smbFile.connect();
            outputStream = new SmbFileOutputStream(smbFile);
            byte[] buffer = new byte[4096];
            int len = 0; // 读取长度
            while ((len = inputStream.read(buffer, 0, buffer.length)) != -1) {
                outputStream.write(buffer, 0, len);
            }
            // 刷新缓冲的输出流
            outputStream.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
    * @Description: 下载文件到指定文件夹
    * @Param:
    * @return:
    * @throws Exception
    * @author: hw
    * @date: 2020/10/9 17:21
    */
    public static void downloadFileToFolder(String remoteUrl, String shareFolderPath, String fileName, String localDir) {
        InputStream in = null;
        OutputStream out = null;
        boolean flag = false;
        try {
            SmbFile remoteFile = new SmbFile(remoteUrl + shareFolderPath + File.separator + fileName);
            if (!remoteFile.exists()) {
               System.out.println("要下载的文件不存在");
            }else {
                flag = true;
                File localFile = new File(localDir + File.separator + 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];
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(flag){
                try {
                    out.close();
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * @Description: 删除文件
     * @Param:
     * @return:
     * @throws Exception
     * @author: hw
     * @date: 2020/10/9 17:21
     */
    public static void deleteFile(String remoteUrl, String shareFolderPath, String fileName) {
        SmbFile SmbFile;
        try {
            // smb://userName:passWord@host/path/shareFolderPath/fileName
            SmbFile = new SmbFile(remoteUrl + shareFolderPath + "/" + fileName);
            if (SmbFile.exists()) {
                SmbFile.delete();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (SmbException e) {
            e.printStackTrace();
        }
    }
}
3.通过浏览器交互代码
import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URLEncoder;
import java.net.UnknownHostException;
/**
 * @program: smbTest
 * @description:
 * @author: hw
 * @create: 2020-10-09 17:12
 */
@RestController
public class SmbController {
    /**
    * @Description: smb文件下载
    * @Param:
    * @return:
    * @throws Exception
    * @author: hw
    * @date: 2020/10/9 17:16
    */
    @GetMapping(value = "/smb")
    public static void downloadFileToBrowser(HttpServletResponse httpServletResponse,
                                             @RequestParam(name = "remoteUrl") String remoteUrl,
                                             @RequestParam(name = "shareFolderPath") String shareFolderPath,
                                             @RequestParam(name = "fileName") String fileName) {
        SmbFile smbFile;
        SmbFileInputStream smbFileInputStream = null;
        OutputStream outputStream = null;
        boolean flag = false;
        try {
            // smb://userName:passWord@host/path/shareFolderPath/fileName
            smbFile = new SmbFile(remoteUrl + shareFolderPath + "/" + fileName);
            if (!smbFile.exists()) {
                System.out.println("要下载的文件不存在");
            }else {
                flag = true;
                smbFileInputStream = new SmbFileInputStream(smbFile);
                httpServletResponse.setHeader("content-type", "application/octet-stream");
                httpServletResponse.setContentType("application/vnd.ms-excel;charset=UTF-8");
                httpServletResponse.setHeader("Content-disposition", "attachment; filename=" + fileName);
                // 处理空格转为加号的问题
                httpServletResponse.setHeader("Content-Disposition", "attachment; fileName=" + fileName + ";filename*=utf-8''" + URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"));
                outputStream = httpServletResponse.getOutputStream();
                byte[] buff = new byte[2048];
                int len;
                while ((len = smbFileInputStream.read(buff)) != -1) {
                    outputStream.write(buff, 0, len);
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (SmbException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(flag){
                try {
                    outputStream.close();
                    smbFileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
    ========================================================================================== 
我希望每一篇文章的背后,都能看到自己对于技术、对于生活的态度。
我相信乔布斯说的,只有那些疯狂到认为自己可以改变世界的人才能真正地改变世界。面对压力,我可以挑灯夜战、不眠不休;面对困难,我愿意迎难而上、永不退缩。
其实我想说的是,我只是一个程序员,这就是我现在纯粹人生的全部。
==========================================================================================

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号