java读取局域网共享文件夹中文件并保存到本地文件夹
创始人
2024-01-29 05:03:33

在磁盘新建一个文件夹,右击文件夹属性,点击共享
在这里插入图片描述

点击网络和共享中心
在这里插入图片描述

设置文件夹可访问权限

在这里插入图片描述
在这里插入图片描述

到此就可以用本地ip加文件夹名称访问了,同局域网也可以通过改地址访问
在这里插入图片描述
文件夹的名称来自这张图的 网络路径
在这里插入图片描述
如果需要通过java的jcifs包访问请继续

这一步开启SMB1和服务器协议配置

命令查看是否开启

Get-SmbServerConfiguration | Select EnableSMB1Protocol, EnableSMB2Protocol

在这里插入图片描述
可以看出当前服务器SMB1未开启,尝试开启SMB1,

在powershell控制台输入:

Set-SmbServerConfiguration -EnableSMB1Protocol $true

报错,指定服务不存在,所以当前的服务器不支持SMB1,到此,原因找到了,因为本地使用的机器支持SMB1所以可以正常运行jcifs的功能,但是正式环境的服务器不支持SMB1,所以报错
我试了几台电脑都报错,所以只能通过控制面板开启,如下图:点击确定后需要重启生效
在这里插入图片描述

java项目 maven 引入

        jcifsjcifs1.3.17

以下代码来自他人博客,略作修改,读取和下载文件是可用的,其他未测试

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/folderNamesmbFile = 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/fileNameSmbFile 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/fileNamesmbFile = 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/fileNameSmbFile = 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());}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
平遥古城在哪 平遥古城基本现状 城垣恢宏,雉堞连云市井街巷,店肆林立四合院落,青砖瓦屋这里是平遥古城历经千年沧桑而古朴宛然,风姿依旧...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
平遥古城在哪 平遥古城基本现状 城垣恢宏,雉堞连云市井街巷,店肆林立四合院落,青砖瓦屋这里是平遥古城历经千年沧桑而古朴宛然,风姿依旧...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...