介绍
基于Spring Boot制作的档案传输工具,方便设备间互相传输资料。
开源地址
https://gitee.com/beautifulwei/file-transfer
安装教程
在idea中直接执行 FileTransferApplication.main。
可以打成jar包在任何有java允许环境的电脑上运行。
https://beautifulwei.gitee.io/pages/files/FileTransfer.jar 这里有已经打好的jar,可直接下载使用。
使用说明
启动项目后,先看到服务管理面板,选择好共享文件夹及运行端口后,启动服务器。(注:面板上还有一个IP选项,是由于电脑可能不止一张网卡,此项仅用于查询ip,省的去控制台打ipconfig)
项目启动后,可在其他内网设备(PC、手机)的浏览器输入 ip:port 即可进入文件列表页,显示的是面板上共享文件夹下的文件(夹),默认是项目的根目录或jar包所在文件夹。
文件列表上半部是文件夹列表,可进入下一级页面。(如果要回上一级,直接按浏览器返回键即可,懒得多敲代码了)
文件列表下半部是可下载文件,点击超链接即可开始下载档案。
最下方可选择上传文件,将档案上传到当前文件列表所在的目录下。
项目结构
本项目就这么几个文件,适合初学者学习借鉴。

主要功能(核心技术)
1. 下载,引入外部资源
@Configuration
public class MobileWebMvcConfigurer implements WebMvcConfigurer {
/**
* 外部资源路径
**/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**").addResourceLocations("file:" + AppData.get().getFilePath() + File.separator);
}
}
addResourceLocations("file:外部资源目录")
addResourceHandler("外部资源的下载目录")
例如 registry.addResourceHandler("/files/**").addResourceLocations("file:D:/")
启动服务后,浏览器输入 localhost:8080/files/test.txt 即可访问到 D:下的test.txt文件
2. 上传
fileList.html
<form id="upload" th:action="${'file/uploadFile?savePath=' + pathEncode}"
method="post" enctype="multipart/form-data" onsubmit="return checkFile()">
<input id="uploadFile" type="file" name="uploadFile" multiple>
<input type="submit" value="上传文件">
</form>
FileController
@PostMapping(value = "/uploadFile", headers = "content-type=multipart/form-data")
private String uploadFile(HttpServletRequest request, String savePath){
Li.i("FileController.uploadFile ip:", WebUtils.getIpAddr(request), ", savePath:", savePath);
MultipartHttpServletRequest multipartRequest = ((MultipartHttpServletRequest) request);
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
if(fileMap.size() == 0){
return returnError(CODE_FAIL, "无上传的档案");
}
int successNo = 0;
int errNo = 0;
for (Map.Entry<String, MultipartFile> entry : fileMap.entrySet()){
String key = entry.getKey();
List<MultipartFile> files = multipartRequest.getFiles(key);
if(files == null || files.size() == 0) continue;
for (MultipartFile file : files) {
Li.i("key:" + key + ", file:" + file.getOriginalFilename());
if (file.isEmpty()) {
errNo++;
continue;
}
File dest = new File(savePath, file.getOriginalFilename());
if(dest.exists()) {
Li.i("已存在:" + dest);
errNo++;
} else {
try {
file.transferTo(dest);
Li.i("文件上传成功:" + dest);
successNo++;
} catch (IOException e) {
e.printStackTrace();
Li.i("文件上传失败:" + dest);
errNo++;
}
}
}
}
StringBuffer sb = new StringBuffer();
if(successNo > 0){
sb.append("上传成功:").append(successNo).append("个文件");
}
if(errNo > 0){
if(successNo > 0){
sb.append(", ");
}
sb.append("上传失败:").append(successNo).append("个文件");
}
if(errNo > 0){
return returnError(CODE_FAIL, sb.toString());
} else {
return returnResult(sb.toString(), null);
}
}
3. javax.swing面板

效果

上述的代码只是一些关键代码,缺少辅助类可能没办法直接“拿来用”,具体实现代码,请直接参考源码。