在磁盘新建一个文件夹,右击文件夹属性,点击共享
点击网络和共享中心
设置文件夹可访问权限
到此就可以用本地ip加文件夹名称访问了,同局域网也可以通过改地址访问
文件夹的名称来自这张图的 网络路径
如果需要通过java的jcifs包访问请继续
这一步开启SMB1和服务器协议配置
命令查看是否开启
Get-SmbServerConfiguration | Select EnableSMB1Protocol, EnableSMB2Protocol
可以看出当前服务器SMB1未开启,尝试开启SMB1,
在powershell控制台输入:
Set-SmbServerConfiguration -EnableSMB1Protocol $true
报错,指定服务不存在,所以当前的服务器不支持SMB1,到此,原因找到了,因为本地使用的机器支持SMB1所以可以正常运行jcifs的功能,但是正式环境的服务器不支持SMB1,所以报错
我试了几台电脑都报错,所以只能通过控制面板开启,如下图:点击确定后需要重启生效
java项目 maven 引入
<!--java 通过 SmbFile 类操作共享文件夹-->
<dependency>
<groupId>jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.17</version>
</dependency>
以下代码来自他人博客,略作修改,读取和下载文件是可用的,其他未测试
import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URLEncoder;
import java.net.UnknownHostException;
/**
* java 通过 SmbFile 类操作共享文件夹
*/
public class SmbFileUtil {
/**
* 读取共享文件夹下的所有文件(文件夹)的名称
*
* @param remoteUrl
*/
public static SmbFile[] getSharedFileList(String remoteUrl) {
SmbFile smbFile;
try {
// smb://userName:passWord@host/path/
smbFile = new SmbFile(remoteUrl);
if (!smbFile.exists()) {
System.out.println("no such folder");
} else {
SmbFile[] files = smbFile.listFiles();
// for (SmbFile f : files) {
// System.out.println(f.getName() + f.getDate());
// }
return files;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SmbException e) {
e.printStackTrace();
}
return null;
}
/**
* 创建文件夹
*
* @param remoteUrl
* @param folderName
* @return
*/
public static void smbMkDir(String remoteUrl, String folderName) {
SmbFile smbFile;
try {
// smb://userName:passWord@host/path/folderName
smbFile = new SmbFile(remoteUrl + folderName);
if (!smbFile.exists()) {
smbFile.mkdir();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SmbException e) {
e.printStackTrace();
}
}
/**
* 上传文件
*
* @param remoteUrl
* @param shareFolderPath
* @param localFilePath
* @param fileName
*/
public static void uploadFileToSharedFolder(String remoteUrl, String shareFolderPath, String localFilePath, String fileName) {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
File localFile = new File(localFilePath);
inputStream = new FileInputStream(localFile);
// smb://userName:passWord@host/path/shareFolderPath/fileName
SmbFile smbFile = new SmbFile(remoteUrl + shareFolderPath + "/" + fileName);
smbFile.connect();
outputStream = new SmbFileOutputStream(smbFile);
byte[] buffer = new byte[4096];
int len = 0; // 读取长度
while ((len = inputStream.read(buffer, 0, buffer.length)) != -1) {
outputStream.write(buffer, 0, len);
}
// 刷新缓冲的输出流
outputStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 下载文件到浏览器
*
* @param httpServletResponse
* @param remoteUrl
* @param shareFolderPath
* @param fileName
*/
public static void downloadFileToBrowser(HttpServletResponse httpServletResponse, String remoteUrl , String fileName) {
SmbFile smbFile;
SmbFileInputStream smbFileInputStream = null;
OutputStream outputStream = null;
try {
// smb://userName:passWord@host/path/shareFolderPath/fileName
smbFile = new SmbFile(remoteUrl + "/" + fileName);
smbFileInputStream = new SmbFileInputStream(smbFile);
httpServletResponse.setHeader("content-type", "application/octet-stream");
httpServletResponse.setContentType("application/vnd.ms-excel;charset=UTF-8");
httpServletResponse.setHeader("Content-disposition", "attachment; filename=" + fileName);
// 处理空格转为加号的问题
httpServletResponse.setHeader("Content-Disposition", "attachment; fileName=" + fileName + ";filename*=utf-8''" + URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"));
outputStream = httpServletResponse.getOutputStream();
byte[] buff = new byte[2048];
int len;
while ((len = smbFileInputStream.read(buff)) != -1) {
outputStream.write(buff, 0, len);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SmbException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
outputStream.close();
smbFileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 下载文件到指定文件夹
*
* @param remoteUrl
* @param shareFolderPath
* @param fileName
* @param localDir
*/
public static void downloadFileToFolder(String remoteUrl, String fileName, String localDir) {
InputStream in = null;
OutputStream out = null;
try {
SmbFile remoteFile = new SmbFile(remoteUrl + "/" + fileName);
File localFile = new File(localDir + File.separator + fileName);
in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
out = new BufferedOutputStream(new FileOutputStream(localFile));
byte[] buffer = new byte[1024];
while (in.read(buffer) != -1) {
out.write(buffer);
buffer = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 删除文件
*
* @param remoteUrl
* @param shareFolderPath
* @param fileName
*/
public static void deleteFile(String remoteUrl, String shareFolderPath, String fileName) {
SmbFile SmbFile;
try {
// smb://userName:passWord@host/path/shareFolderPath/fileName
SmbFile = new SmbFile(remoteUrl + shareFolderPath + "/" + fileName);
if (SmbFile.exists()) {
SmbFile.delete();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SmbException e) {
e.printStackTrace();
}
}
}
业务实现代码
FileUtil.isFile来自cn.hutool.core.io (hutool包),判断文件是否存在的
upLoadPath 是本地地址的文件夹路径
代码意思就是读取共享文件夹的文件,然后下载保存到本地地址
@GetMapping(value = "/getSmbFile")
public Result<?> getSmbFile(HttpServletResponse httpServletResponse) {
SmbFile[] files = SmbFileUtil.getSharedFileList("smb://10.10.41.53/可选性曲线图片/");
SmbFile smbFile = files[files.length - 1];
boolean bo = FileUtil.isFile(new File(upLoadPath+"\\"+smbFile.getName()));
if (!bo){
SmbFileUtil.downloadFileToFolder("smb://10.10.41.53/可选性曲线图片/", smbFile.getName(), upLoadPath);
}
return Result.ok(smbFile.getName());
}