cifs 文件服务器,使用SMB/CIFS做文件服务器

本文介绍了如何使用Java的SMB/CIFS组件访问和管理Windows共享文件夹,包括文件和目录的增删改查以及上传下载操作。通过示例代码展示了如何列出目录文件、上传和下载文件,并讨论了可能遇到的权限和网络问题,以及解决方案。
摘要由CSDN通过智能技术生成

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("文件上传成功...");

}

}

运行结果如下:

1469149187896024453.png.image

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

1469149187927053821.png.image

1469149188055052074.png.image

总结:在读取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(Common Internet File System) 协议 CIFS 是一个新提出的协议,它使程序可以访问远程Internet计算机上的文件并要求此计算机的服务。CIFS 使用客户/服务器模式。客户程序请求远在服务器上的服务器程序为它提供服务。服务器获得请求并返回响应。CIFS是公共的或开放的SMB协议版本,并由Microsoft使用SMB协议现在是局域网上用于服务器文件访问和打印的协议。象SMB协议一样,CIFS在高层运行,而不象TCP/IP协议那样运行在底层。CIFS可以看是应用程序协议如文件传输协议和超文本传输协议的一个实现。 SMB协议是基于TCP-NETBIOS下的,一般端口使用为139,445。 服务器信息块(SMB)协议是一种IBM协议,用于在计算机间共享文件、打印机、串口等。SMB 协议可以用在因特网的TCP/IP协议之上,也可以用在其它网络协议如IPX和NetBEUI 之上。   SMB 一种客户机/服务器、请求/响应协议。通过 SMB 协议,客户端应用程序可以在各种网络环境下读、写服务器上的文件,以及对服务器程序提出服务请求。此外通过 SMB 协议,应用程序可以访问远程服务器端的文件、以及打印机、邮件槽(mailslot)、命名管道(named pipe)等资源。   在 TCP/IP 环境下,客户机通过 NetBIOS over TCP/IP(或 NetBEUI/TCP 或 SPX/IPX)连接服务器。一旦连接成功,客户机可发送 SMB 命令到服务器上,从而客户机能够访问共享目录、打开文件、读写文件,以及一切在文件系统上能的所有事情。   从 Windows 95 开始,Microsoft Windows 操作系统(operating system)都包括了客户机和服务器 SMB 协议支持。Microsoft 为 Internet 提供了 SMB 的开源版本,即通用 Internet 文件系统 (CIFS)。与现有 Internet 应用程序如文件传输协议(FTP)相比, CIFS 灵活性更大。对于 UNIX 系统,可使用一种称为 Samba 的共享软件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值