近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码。
一、Tomcat服务器部分
1、Tomcat服务器
单独复制一份Tomcat,用来作为文件服务器
1.1 web.xml文件:
需要在该Tomcat的conf目录下的web.xml文件的大概100行添加如下几行(红框内部分):
1.2 server.xml文件:
需要在该Tomcat的conf目录下的server.xml文件做一些端口的修改
1.3 Tomcat下建立文件夹
在该Tomcat的/webapps/ROOT目录下创建一个upload目录,用来存放上传的文件
1.4 启动Tomcat服务器
以上三步做完后,就可以启动Tomcat服务器了,在Tomcat的bin目录下执行 startup.sh 脚本
二、java部分
2.1 jar包
除了其他的jar包以外,还需要以下几个jar包
commons-io-1.3.2.jar
commons-fileupload-1.2.1.jar
jersey-client-1.18.1.jar
jersey-core-1.18.1.jar
jersey-common
2.2 配置文件
2.2.1 spring-mvc.xml文件添加如下部分:
2.2.2 config.properties 文件添加如下部分:
#文件服务器地址
uploadHost=http://172.16.5.102:8090/
#上传的文件保存的目录
imgPath = upload/
2.3 java文件
2.3.1 Upload.java
packagecom.lin.utils;importjava.io.File;importjava.io.IOException;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.commons.io.FilenameUtils;importorg.springframework.web.multipart.MultipartFile;importcom.sun.jersey.api.client.Client;importcom.sun.jersey.api.client.WebResource;/*** 上传文件工具类
*@authorlibo*/
public classUpload {/*** 上传文件
*@paramrequest
*@paramresponse
*@paramserverPath 服务器地址:(http://172.16.5.102:8090/)
*@parampath 文件路径(不包含服务器地址:upload/)
*@return
*/
public staticString upload(Client client, MultipartFile file, HttpServletRequest request,HttpServletResponse response, String serverPath, String path){//文件名称生成策略(UUID uuid = UUID.randomUUID())
Date d = newDate();
SimpleDateFormat format= new SimpleDateFormat("yyyyMMddHHmmss");
String formatDate=format.format(d);
String str= "";for(int i=0 ;i <5; i++){int n = (int)(Math.random()*90)+10;
str+=n;
}//获取文件的扩展名
String extension =FilenameUtils.getExtension(file.getOriginalFilename());//文件名
String fileName = formatDate + str + "." +extension;//相对路径
String relaPath = path +fileName;
String a= serverPath + path.substring(0, path.lastIndexOf("/"));
File file2= newFile(a);if(!file2.exists()){boolean mkdirs =file2.mkdirs();
System.out.println(mkdirs);
}//另一台tomcat的URL(真实路径)
String realPath = serverPath +relaPath;//设置请求路径
WebResource resource =client.resource(realPath);//发送开始post get put(基于put提交)
try{
resource.put(String.class, file.getBytes());return fileName+";"+relaPath+";"+realPath;
}catch(IOException e) {
e.printStackTrace();return "";
}
}/*** 删除文件
*@paramfilePath(文件完整地址:http://172.16.5.102:8090/upload/1234.jpg)
*@return
*/
public staticString delete(String filePath){try{
Client client= newClient();
WebResource resource=client.resource(filePath);
resource.delete();return "y";
}catch(Exception e) {
e.printStackTrace();return "n";
}
}
}
2.3.2 controller层
packagecom.lin.controller;importjava.io.File;importjava.io.IOException;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.annotation.Resource;importjavax.servlet.ServletContext;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.multipart.MultipartFile;importorg.springframework.web.multipart.MultipartHttpServletRequest;importorg.springframework.web.multipart.MultipartResolver;importorg.springframework.web.multipart.commons.CommonsMultipartResolver;importorg.springframework.web.servlet.config.VelocityConfigurerBeanDefinitionParser;importcom.lin.domain.data.ResData;importcom.lin.domain.data.ResListData;importcom.lin.domain.error.Error;importcom.lin.domain.sysUser.SysUser;importcom.lin.domain.sysUser.SysUserWithDep;importcom.lin.service.SysUserService;importcom.lin.utils.Aes;importcom.lin.utils.DateTimeUtils;importcom.lin.utils.ResponseUtils;importcom.lin.utils.Upload;importcom.lin.utils.Utils;importcom.sun.jersey.api.client.Client;importnet.sf.json.JSONObject;/*** 后台用户-controller
*@authorlibo*/@Controller
@RequestMapping("/sysUser")public classSysUserController {
@ResourceprivateSysUserService sysUserService;
@Value(value="${imgPath}") //后台图片保存地址
privateString imgPath;
@Value(value="${uploadHost}")private String uploadHost; //项目host路径
/*** 后台用户登陆功能*@return*@throwsIOException*/@ResponseBody
@RequestMapping(value="/login.do", method=RequestMethod.POST)public voidlogin(HttpServletRequest req, HttpServletResponse res,
@RequestParam(required=true) String loginEmail,
@RequestParam(required=true) String loginPwd) throwsIOException{
//代码省略}/*** 根据id查询用户信息(包括部门信息)
*@paramreq
*@paramres
*@paramid
*@throwsIOException*/@ResponseBody
@RequestMapping(value="/getSysUser.do", method=RequestMethod.GET)public voidgetSysUser(HttpServletRequest req, HttpServletResponse res,
@RequestParam(required=true) Integer id) throwsIOException{
//代码省略}/*** 更新后台用户信息
*@paramreq
*@paramres*@throwsIOException*/@ResponseBody
@RequestMapping(value="/updateSysUser.do" ,method=RequestMethod.POST)public void updateSysUser(HttpServletRequest req, HttpServletResponse res) throwsIOException{
//代码省略}/*** 添加用户
*@paramreq
*@paramres
*@throwsIOException*/@ResponseBody
@RequestMapping(value="/addSysUser.do", method=RequestMethod.POST)public void addSysUser(HttpServletRequest req, HttpServletResponse res) throwsIOException {
//代码省略}/*** 上传用户头像
*@paramrequest
*@paramresponse*/@ResponseBody
@RequestMapping(value="uploadSysHeadImg.do", method=RequestMethod.POST)public voiduploadSysHeadImg(HttpServletRequest request,HttpServletResponse response){
JSONObject jo= newJSONObject();try{
MultipartResolver resolver= newCommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest Murequest=resolver.resolveMultipart(request);
Map files = Murequest.getFileMap();//得到文件map对象//实例化一个jersey
Client client = newClient();
List fileNameList = new ArrayList<>();
List relaPathList = new ArrayList<>();
List realPathList = new ArrayList<>();for(MultipartFile pic: files.values()){String uploadInfo = Upload.upload(client, pic, request, response, uploadHost, imgPath);
if(!"".equals(uploadInfo)){ //上传成功
String[] infoList = uploadInfo.split(";");
fileNameList.add(infoList[0]); //文件名
relaPathList.add(infoList[1]); //相对路径
realPathList.add(infoList[2]); //真实完整路径
}else{ //上传失败
fileNameList.add("");
relaPathList.add("");
realPathList.add("");
}
}
jo.put("success", 1);
jo.put("error", null);
jo.put("fileNameList", fileNameList);
jo.put("relaPathList", relaPathList);
jo.put("realPathList", realPathList);
}catch(Exception e) {
jo.put("success", 0);
jo.put("error", "上传失败");
}
ResponseUtils.renderJson(response, jo.toString());
}
}
其他的java文件省略,然后运行java项目
三、前端部分
3.1 index1-cropper图片剪切上传
index1-cropper图片剪切上传上传头像
保存