当我们在做项目时难免都要上传附件,这时我们会用到市面上开源的文件服务器,例如FastDFS
,ServU
,HDFS
等文件服务器,我想我可不可以做一个简易版本的小型文件服务器系统呢?
一,文件服务器的主要工作内容是什么?
- 向外界提供上传附件的接口
- 向外界提供附件在线预览地址的接口
- 服务器本身在硬盘上对所有的附件作统一管理
二,文件服务器的原理是什么?
文件服务器作为服务端,自然要接收客户端发送来的文件并将文件写入本地磁盘,然后做一些处理可以预览附件,那么这一句话就够用了,下面开始动手写一个简易的文件服务器。
三,动手写文件服务器
写这个服务器没有用到数据库,全都是文件流的操作,仅此而已!
1,服务端接收上传文件的接口
写对外开放的为客户端上传附件的接口,参数为MultipartFile
对象,客户端只需要直接将文件MultipartFile
参数传过来即可。
其中文件上传到了Tomcat/webapps/
中的一个文件夹,同时Tomcat
要开启状态,因为拼接上域名和文件路径以及文件名就可以直接下载了。
@Controller
@RequestMapping("/rest")
public class CreateFileController {
//硬盘文件地址(存储文件地址)
// private static final String dirPath="D:\\suibian\\test\\";
private static final String dirPath="/usr/local/share/apache-tomcat-8.5.40/webapps/files/";
//Tomcat域名,拼接上文件名可直接下载
private static final String tomcatUrl="https://www.tiger2.cn/files/";
//客户端向本服务端上传文件的开放接口
@PostMapping("createFile")
@ResponseBody
public Map<String, Object> createFile(MultipartFile uploadFile, String uploader) {
String message = "";
boolean success = true;
//构建新的文件名并进行存储,存储到云服务的文件夹中
String originalFilename = uploadFile.getOriginalFilename();
String suffix=originalFilename.substring(originalFilename.lastIndexOf("."));
long time=new Date().getTime();
String newFileName=originalFilename.substring(0,originalFilename.lastIndexOf("."))+String.valueOf(time)+suffix;
try {
//FileUtils.copyInputStreamToFile是commons-io包下的方法,可以直接将输入流转为一个新的文件(前提是指定好路径和要生成的文件名)
FileUtils.copyInputStreamToFile(uploadFile.getInputStream(),
new File(dirPath + newFileName));
} catch (Exception e) {
message = e.getMessage();
success = false;
}
Map<String, Object> result = new HashMap<>();
result.put("message", message);
result.put("success", success)<