登陆域账户
方法一
在web.xml中加入过滤器
<filter>
<filter-name>NtlmHttpFilter</filter-name>
<filter-class>jcifs.http.NtlmHttpFilter</filter-class>
<!--jcifs.http.domainController 这个参数指定了DNS服务器的地址-->
<init-param>
<param-name>jcifs.http.domainController</param-name>
<param-value>domainip</param-value>
</init-param>
<!--jcifs.smb.client.domain 这个参数指定了DNS服务器的域名-->
<init-param>
<param-name>jcifs.smb.client.domain</param-name>
<param-value>domain</param-value>
</init-param>
<init-param>
<param-name>jcifs.util.loglevel</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.lmCompatibility</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.client.useExtendedSecurity</param-name>
<param-value>false</param-value>
</init-param>
<!-- 连接超时时间 -->
<init-param>
<param-name>jcifs.smb.client.soTimeout</param-name>
<param-value>5000</param-value>
</init-param>
<!--域 的用户 和密码 (ad管理员的用户名密码,部署到正式环境需要修改)-->
<init-param>
<param-name>jcifs.smb.client.username</param-name>
<param-value>username</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.client.password</param-name>
<param-value>password</param-value>
</init-param>
</filter>
<!-- 拦截请求 -->
<filter-mapping>
<filter-name>NtlmHttpFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
启动项目容器,访问项目 会弹出登录框,可以直接回车登陆
方法二
private static NtlmPasswordAuthentication authentication = null;
/**
* 登录共享文件服务器
* @return
*/
static{
//参数 1:域名,2:用户名,3:密码
authentication = new NtlmPasswordAuthentication(SharePropertires.DoMain,
SharePropertires.UserName, SharePropertires.PassWord);
try {
UniAddress uniAddress = UniAddress.getByName(SharePropertires.ShareIP); //参数 为IP
SmbSession.logon(uniAddress, authentication); //登录
} catch (Exception e) {
authentication = null;
logger.error(“登录共享文件服务器”+SharePropertires.ShareIP+”失败”);
}
}
//authentication 为上面初始化的后的内容
//urlFilePath 为文件下载路径
SmbFile file = new SmbFile(urlFilePath, authentication);
获取文件并下载的方法如下,以上两种方法皆适用
/**
* 使用Jcifs SmbFile下载文件
* @param localFilePath 下载本地路径
* @param urlFilePath 文件Url地址 参数样例:smb://129.0.0.1/data/ 为文件夹 注意文件类型Url后面加入 **/**
* smb://129.0.0.1/data/data.text 为文件
* @return
*/
public static void downLoadShareFile(String localFilePath, String urlFilePath) throws Exception{
//这一行代码听说可以加快文件下载的速度,还未尝试。如果尝试后好用会回来补充
System.setProperty("jcifs.smb.client.dfs.disabled", "true");
SmbFile file;
SmbFile[] files = null;
if(authentication != null){
try {
file = new SmbFile(urlFilePath, authentication);
if(file.isDirectory()){ //若文件为文件夹
files = file.listFiles();
for (SmbFile smbFile : files) {
String fileName = smbFile.getName();
SmbFileInputStream inputStream = new SmbFileInputStream(file);
new DownLoadFile(localFilePath+fileName, inputStream, 4,
file.getContentLength()).downLoadFileByInputStream();
}
} else if(file.isFile()){ //若为文件
String fileName = file.getName();
SmbFileInputStream inputStream = new SmbFileInputStream(file);
new DownLoadFile(localFilePath+fileName, inputStream, 4,
file.getContentLength()).downLoadFileByInputStream();
}
} catch (Exception e) {
logger.error("共享文件服务器访问失败:"+e.getMessage());
throw new Exception("共享文件服务器访问失败:"+e.getMessage());
}
}
}
上面的文件下载 使用的是线程下载,百度可得
int filesize = smbFile.getContentLength() ;
long filesize = smbFile.getContentLengthLong();
关于使用SmbFile获取文件大小,参考了java.io类
使用 SmbFile.length(); 获取long类型的bytes数据
完美解决文件过大不能使用getContentLength()的问题!!!
办法总比困难多!!!