import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@Data
@Slf4j
public class SmbFileUtil {
private String url;
private static SmbFileUtil smb;
/**
* @param ip 共享服务器ip
* @param usrName 用户名
* @param pwd 密码
* @param shareDirectory 共享目录:/shareDir
* @return
*/
public static SmbFileUtil getInstance(String ip , String usrName, String pwd, String shareDirectory) {
if(smb == null) {
return new SmbFileUtil(ip, usrName, pwd, shareDirectory);
}
return smb;
}
private SmbFileUtil(String ip , String usrName, String pwd, String shareDirectory) {
url = "smb://"+ usrName +":"+ pwd +"@"+ ip + shareDirectory;
}
private boolean connect() {
log.info("开始连接共享目录:{}", this.url);
try {
SmbFile smb = new SmbFile(this.url);
smb.connect();
log.info("连接成功");
return true;
} catch (Exception e) {
log.info("连接失败,{}", e.getMessage());
log.error("{}共享目录连接失败", url, e);
return false;
}
}
/**
* 上传文件到共享目录
* @param localFile 本地文件
* @param isCreateFolder 是否在共享目录下创建文件夹
* @param isCover 是否覆盖同名文件
* @throws IOException
*/
public void uploadFile( File localFile, boolean isCreateFolder, boolean isCover) throws IOException {
boolean isCon = connect();
if(!isCon) {
return;
}
SmbFile smbFile = new SmbFile(this.url);
if(!smbFile.exists()) {
log.info("共享目录不存在");
if(!isCreateFolder) {
return;
}else {
smbFile.mkdirs();
log.info("创建此文件夹");
}
}
BufferedInputStream in = null;
SmbFileOutputStream out = null;
try {
log.info("开始上传文件:{}", localFile);
String fileName = localFile.getName();
String des = smbFile.getPath()+ "/" + fileName;
SmbFile desFile = new SmbFile(des);
if(desFile.exists()) {
if(isCover) {
log.info("同名文件已存在,覆盖原文件");
}else {
log.info("存在同名文件,不上传。");
return;
}
}
out = new SmbFileOutputStream(des);
in = new BufferedInputStream(new FileInputStream(localFile));
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer))!= -1) {
out.write(buffer, 0 ,len);
out.flush();
}
log.info("上传成功");
}finally {
if(in != null) in.close();
if(out != null) out.close();
}
}
/**下载文件
* @param shareFileName 共享目录下的文件名
* @param localPath 本地存储文件路径
* @param isCover 是否覆盖本地同名文件
* @throws IOException
*/
public void downloadFile(String shareFileName, String localPath, boolean isCover) throws IOException {
boolean isCon = connect();
if(!isCon) {
return;
}
SmbFile smbFile = new SmbFile(this.url);
SmbFile srcFile = new SmbFile(this.url + "/" + shareFileName);
if(!smbFile.exists() || !srcFile.exists()) {
log.info("需要下载的共享文件或目录不存在");
return;
}
SmbFileInputStream in = null;
FileOutputStream out = null;
try {
log.info("开始下载文件到:{}", localPath);
String des = localPath + "/" + shareFileName;
File desFile = new File(des);
if(!desFile.getParentFile().exists()) {
desFile.getParentFile().mkdirs();
}
if(desFile.exists()) {
if(isCover) {
log.info("同名文件已存在,覆盖原文件");
}else {
log.info("存在同名文件,不下载。");
return;
}
}
out = new FileOutputStream(des);
in = new SmbFileInputStream(srcFile);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer))!= -1) {
out.write(buffer, 0 ,len);
out.flush();
}
log.info("下载成功");
}finally {
if(in != null) in.close();
if(out != null) out.close();
}
}
public void uploadFolder(File localFolder) {
}
}
<dependency>
<groupId>org.samba.jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.3</version>
</dependency>