SMB/CIFS组件是一种Java访问共享文件夹的实现,使用它也是可以很方便的管理上传下载的文件,先闲话一些别的吧。很久以前有遇到文件的上传下载时,很“单纯”的将文件写至servletContext.getRealPath("/files");目录下,然后就没有然后了,后来慢慢的将某个服务器的共享文件夹以磁盘映射的方式作为本地的磁盘进行访问,也就是说访问时以Z:\\shares......去访问共享文件......在之前的项目中新做的文件上传下载有要求写入一个服务器上,而使用的技术实现则是从一个老系统中迁移出来的,我还一直以为用到的实现时上传的文档服务器提供的接口,并未多想,如果不是前段时间又遇到此种问题了,或许也就没有下文了。最近我找了找它还真的是一个开源组件,基于smb协议的文件访问。一般项目当中的文档管理,基本的功能是对文档目录的列表读取、文件(夹)的增删改查以及文件的上传下载等,其最核心的包括:

1、根据目录获取目录下的所有文件(夹);

根据目录读取所有文件(夹),有了它就相当于有了文件结构的树,进一步说可以对目录及文件的增删改查了。

2、根据文件的标识获取文件的输入输出流;

输入输出流对应了文件的上传下载,如果说文件结构管理是管理员做的事情,那么上传下载就是与普通用户交互的了,有了输出流可以下载一个文件(直接输出至浏览器);输入流可将上传的附件写入共享目录中了。

简单的实现其实就是这么点儿了,将之前使用时的一些经验做了个简单的例子,包括文件的结构读取、文件的写入和写出,参考如下代码:

org.samba.jcifs

jcifs

1.3.14-kohsuke-1

/**

*

*/

packagecn.chendd.smb;

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.FileOutputStream;

importjava.io.InputStream;

importjava.io.OutputStream;

importjcifs.smb.SmbFile;

/**

*@authorchendd

*

*/

public classTest {

/**

* smb允许的URL为文件夹时必须以/结束,获取到的文件夹的名称仍然以/结束

*/

private static finalStringSMB_SHARE_FOLDER="smb://chendd:admincdd@127.0.0.1/smbShareTest/";

/**

* smb允许的URL为文件夹时必须以/结束

*@throwsException

*/

public static voidlistFiles()throwsException{

SmbFile smbFile =newSmbFile(SMB_SHARE_FOLDER);

SmbFile files[] = smbFile.listFiles();

for(SmbFile file : files){

System.out.println("名称:"+ file.getName() +",类型:"+ (file.isDirectory() ?"文件夹":"文件"));

}

}

public static voidmain(String[] args)throwsException {

//打印共享目录下所有的文件

System.out.println("*****打印共享文件夹下的所有一级目录*****");

listFiles();

System.out.println("================================");

//将某个文件写入共享目录

System.out.println("*****上传一个文件至共享目录*****");

uploadFile();

System.out.println("================================");

System.out.println("*****从共享目录中下载一个文件*****");

downloadFile();

}

private static voiddownloadFile()throwsException{

SmbFile smbFile =newSmbFile(SMB_SHARE_FOLDER+"jdfw.gif");

File outputFile =newFile("C:\\Users\\chendd\\Desktop\\jdfw_new.gif");

InputStream is = smbFile.getInputStream();

OutputStream os =newFileOutputStream(outputFile);

byteb[] =new byte[1024];

intlen = 0;

while((len = is.read(b)) != -1){

os.write(b, 0, len);

}

os.flush();

os.close();

System.out.println("文件下载成功...");

}

private static voiduploadFile()throwsException {

File file =newFile("C:\\Users\\chendd\\Desktop\\jdfw.gif");

String fileName= file.getName();

SmbFile smbFile =newSmbFile(SMB_SHARE_FOLDER+ fileName);

InputStream is =newFileInputStream(file);

byteb[] =new byte[1024];

intlen = 0;

OutputStream out = smbFile.getOutputStream();

while((len = is.read(b)) != -1){

out.write(b, 0, len);

}

out.flush();

out.close();

System.out.println("文件上传成功...");

}

}

运行结果如下:

当访问一个everyone的共享目录时,且不需要密码时的smb协议路径为:smb://127.0.0.1/smbShareTest/,一般情况下常常是会有账户密码的,就给出例子中的写法,本示例中的共享目录是本机的,在示例中遇到了一个smb Logon failure错误,解决方式如下:

总结:在读取Windows的共享目录时,可能会由于网络问题、权限问题而出现一些问题。

@补充一下,

1、密码含有特殊字符的问题

一般在使用smb访问共享文件的时候,除了上述方式外还有另外一种方式,即请求的地址为:smb://ip/路径,避免账号和密码在这个地址中存在,因为密码可以是含有特殊字符的,一旦含有一些其它特殊字符直接请求是会有问题的,所以通常还会有另外一种写法:String shareFolder = "smb://127.0.0.1/test/";

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("127.0.0.1", "admin", "passwor$@f/\@F");

SmbFile smbFileFolder = new SmbFile(shareFolder , auth);

String lists[] = smbFileFolder.list();

for (String list : lists) {

System.out.println(list);

}

2、有时候访问的共享文件特别慢

出现这个情况是通过SmbFile获取到了一个数组对象,循环它里面的一个个具体文件的时候,导致特别慢,进程假死等情况,后来换成了在循环的时候再重新根据地址去构造一个新文件的

方式来解决,参考代码为:BufferedInputStream bis = new BufferedInputStream(new SmbFileInputStream(....));

cifs 文件服务器,使用SMB/CIFS做文件服务器相关推荐

  1. cifs文件服务器,samba - 为 UNIX 实现的 Windows SMB/CIFS 文件服务器

    SYNOPSIS 总览 Samba DESCRIPTION 描述 samba 套件是在 UNIX 系统上实现"服务器信息块"(通常简称 SMB) 协议的一组程序.这个协议有时也称为 ...

  2. 云服务器 文件服务,云服务 做文件服务器

    云服务 做文件服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分别安装数据传 ...

  3. apache 文件 服务器,apache做文件服务器

    apache做文件服务器 内容精选 换一换 客户端IP指的是访问者(用户设备)的IP地址.在Web应用开发中,通常需要获取客户端真实的IP地址.例如,投票系统为了防止刷票,需要通过获取客户端真实IP地 ...

  4. linux挂载cifs磁盘_将SMB/CIFS网络硬盘永久的挂载到Ubuntu上

    SMB/CIFS 这里针对的是SMB/CIFS协议.记得SMB之前爆发过大BUG,而且,好像逐渐要废弃掉.这里给出的方案是针对CIFS的.至于SMB和CIFS各是什么,区别是什么请自行google. ...

  5. 文件共享之SMB/CIFS协议及Samba的使用

    1 SMB/CIFS协议及Samba的介绍 1.1 SMB/CIFS协议  SMB(Server Message Block)又称CIFS(Common Internet File System),一 ...

  6. 创建 Time Machine 时间机器的备份至 openmediavault 5(OMV 5) NAS 的 SMB/CIFS 共享文件夹

    原文链接 https://refrain.cn/blog/1/post/time-machine-openmediavault-5-omv-5-nas-smb-cifs-86 在 OMV 4 中支持使 ...

  7. [转]应用SMB/CIFS协议

    第一节 本文的目的    Microsoft公开了CIFS协议的所有细节,这使得我们可以了解这个协议并且编写基于这个协议的应用程序. SMB/CIFS协议在Windows系统中的被广泛的应用,这要求我 ...

  8. 文件服务器换个用登录,文件服务器迁移 登录

    文件服务器迁移 登录 内容精选 换一换 服务器迁移通常有三种手段:全新部署业务.主机迁移服务.镜像迁移,如表1所示.对于华为云上云服务器的跨账号跨区域迁移,建议采用镜像迁移方式.跨账号跨区域迁移云服务 ...

  9. linux挂载cifs磁盘_SMB、CIFS和NETBIOS协议概念及linux挂载远程文件系统

    一.SMB(Server Message Block)协议 SMB协议是基于TCP-NETBIOS下的,一般端口使用为139,445. 服务器信息块(SMB)是微软(Microsoft)和英特尔(In ...

最新文章

  1. SQL语句书可以提高执行效率的5种需要注意的书写方法
  2. (译)Objective-C的动态特性
  3. 《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.5 为跨年度的个人参赛选手构造记录...
  4. 滴滴公众评议会第十一期:司机也可以评价乘客 你支持吗?
  5. 【Oracle】删除手工创建的数据库
  6. iOS底层探索之LLVM(一)——初识LLVM
  7. 为什么双重检查锁模式需要 volatile ?
  8. 离散数学思维导图 - 集合论,命题逻辑,谓词逻辑,二元关系,特殊关系,图论,树
  9. python查询IP归属地
  10. 如何让函数只执行一次
  11. 应届生如何轻松通过Java面试
  12. Keystore was tampered with, or password was incorr
  13. 疫情之下,互联网产品逆势爆发
  14. 画出漂亮的神经网络图,神经网络可视化工具集锦
  15. PyTorch 和 TensorFlow的区别
  16. 在 Linux安装Dataiku DSS步骤
  17. 如何辨识“真假”敏捷?
  18. 《RCLane:Relay Chain Prediction for Lane Detection》论文笔记
  19. 睡觉也在爬虫之一(爬一张图片)
  20. CCNA-NAT协议 静态NAT 动态NAT(多对多) PAT(多对一) 内网与外网之间的通信 GNS3实验验证

热门文章

  1. Starting Tomcat v7.0 Server at localhost' has encountered a problem问题的解决
  2. 返利网java面试_腾讯系统测试面试经验
  3. 机器学习(三):基于LightGBM的分类预测
  4. 20140221我在公司发的饶绍
  5. python安卓自动化测试工具有哪些_Android 手机自动化测试工具有哪几种?
  6. 融云IM技术分享:万人群聊消息投递方案的思考和实践
  7. android问题汇总系列之一
  8. 新规范关于工程总承包项目组织机构的设置及岗位解读
  9. Tableau 十二、网络图与弧线图
  10. 如何提交一个PR?完成这 6 点就可以了