目录
实现策略:
1.通过java 上传技术实现文件从客户端上传到服务器某个位置
2.服务器上传到的位置采用共享文件夹的方式实现,这样易于扩展
3.通过nginx服务器配置
4.location /0/的方式实现无线扩展
5.root 配置的内容系统的共享文件夹,越大越好
6.用户提交文件java 后台吧文件存放到 root后的文件夹中
7.当一个共享文件夹内部快放满的时候,我们新建一个新的 location
8.这样在用户访问文件服务器的时候回自动寻找自己的图库地址
package com.supermap.file;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.supermap.uitl.DateTimeUitl;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import javax.servlet.http.HttpSession;
/**
* 文件上传类
*
* @author yushen
*
*/
@Controller
public class UploadController {
/**
* 创建日志
*
*/
private static final Log LOGGER = LogFactory.getLog(UploadController.class);
//获取基础文件服务路径地址(入服务器id,服务器文件服务路径)0代表第一个太文件服务器
@Value("${image.location.path}")
private String Basicspath;
@Value("${image.location.library}")
//获取库存放地址
private String resourcelibrary;
/**
* 文件上传方法
*
* @param file
* @param session
* @return
*/
@RequestMapping("/Upload")
@ResponseBody
public String Upload(@RequestParam("file") MultipartFile file,HttpSession session) {
//通过session 获取用户的id 生成用户id库路径
Integer user = (Integer) session.getAttribute("user");
if(user == null) {
return "上传失败,没有用户信息!";
}
//记录日志
LOGGER.info(new StringBuffer("用户:"+user)+"开始上传文件!");
//文件判断为空
if (file.isEmpty()) {
return "上传失败,请选择文件";
}
//获取文件原始名称
String fileOriginalName = file.getOriginalFilename();
//设置文件前缀
String fliePrefix = "";
//设置文件后缀
String fileSuffix = "";
//校验文件名安全性
if(fileOriginalName.indexOf(".") != -1) {//判断事包含带有结尾符的文件
//只支持上传jpg和png格式文件图片
if(fileOriginalName.split("\\.")[1].equals("png") || fileOriginalName.split("\\.")[1].equals("jpg")) {
fliePrefix = UUID.randomUUID().toString().replace("-", "");
fileSuffix = fileOriginalName.split("\\.")[1];
} else {
return "上传失败,上传文件类型不是png和jpg格式!";
}
}
//系统设置路径
String newfilePath = resourcelibrary + DateTimeUitl.nowTimeA +"/" + user + "/" ;
//唯一服务地址
String newfilePathOnly = Basicspath +newfilePath;
//判断地址是否存在
File fileUIS = new File(newfilePathOnly);
if(!fileUIS.exists()){//如果不存在文件夹创建文件夹
fileUIS.mkdirs();
}
String OnlyStr = newfilePathOnly + fliePrefix + "." + fileSuffix;
//设置文件载入到的地址
File dest = new File(OnlyStr);
try {
file.transferTo(dest);
LOGGER.info("文件:"+fliePrefix + "." + fileSuffix+"上传成功");
return "上传成功,文件地址:" + newfilePath+fliePrefix + "." + fileSuffix;
} catch (IOException e) {
LOGGER.error(e.toString(), e);
}
return "上传失败!";
}
}
配置文件 application.properties
#路径/
image.location.path=f:/serverImagel/
#文件存放库地址
image.location.library=0/
一个文件中放不下的时候就修改一下这个地址
#路径/
image.location.path=R:/serverImagel/
#文件存放库地址
image.location.library=1/
server {
listen 80;
#配置静态图片服务器地址
location /0/ {#为方便之后扩展文件服务器没一个库用一个单独的0开头
#这个地址放在那里可以随意最好采用共享磁盘的方式,这样就可以无限扩展
root F:\serverImagel;
}
}
location /1/ {#为方便之后扩展文件服务器没一个库用一个单独的0开头
#这个地址放在那里可以随意最好采用共享磁盘的方式,这样就可以无限扩展
root E:\serverImagel;
}
当然如果公司的用户量特别大那么可以写个小程序,按照用户的文件增长水平写一个心跳的监控
当发现服务器某个盘符快满的时候,就让代码自动修改配置文件 (一个修改java的,一个增加nginx的)
增加nginx的方式可以每次增加完毕后,记录上次增加的行数,对应算出下一次本次需要增加行数的位置
这样就实现了Tracker追踪器。
文件上传web
Document
访问地址:
http://localhost/0/20181204/1000000001/e0973b2185094765af4d9054aa90f059.jpg
域名加服务器返回的地址,将这个地址存入到自己的服务器数据库中即可
最后就是数据同步:
这个就是磁盘备份从网上找找就好特别多
比如 微软官方出品的文件备份软件 SyncToy 可以支持 1)安全2)稳定
比较是微软自己的比起普通的软件强了特别多大家如果没别的常用软件可以试试这个。网上教程也挺多的可以去瞧瞧
最近项目需要个文件服务器,但是看了下市场上的文件服务器,感觉搭建步骤看api文档等情况太繁琐,不想看,于是就自己研究建了一个,感觉还是自己做出来的用的方便,有兴趣的可以一起聊聊
qq:1251767927