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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(....));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值