这篇文章不只是java代码,也有一些功能的思路,我网上也搜索了一些上传文件文章的,很多单纯侧重于代码层面,所以如果只是简单实现上传文件到windows服务器之类的,那么本篇参考意义不大
做分布式,可扩展的文件上传,首先确定以下几点要求 1.linux服务器配置(基本的读写权限(上传/访问),二级域名,防火墙…) 2.反向代理的问题(中间件,本次使用nginx) 3.上传代码(文件配置,上传路径问题,前后台对接…)
以下为详细步骤,根据开发顺序,我们其实首先要做的是代码,因此,先讲第三步
上传代码
1.上传文件配置,后台用的springboot
#文件上传配置
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=5MB
spring.servlet.multipart.max-request-size=5MB
看不懂可以留言
2.后台代码 控制层controller
@PostMapping("/upload")
public ImaUpload uploadFile(MultipartFile file) {
return FileUtils.uploadFile(file);
}
工具类(我这里业务需求是上传图片,所以会加入图片的判断,如果是上传其他文件,去掉判断就行)
package com.test.util;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;
public class FileUtils {
private static String dirPath="/test/tomcat/data/image_upload/";
private static String urlPath="http://test.image.com.cn/";
public static ImaUpload uploadFile(MultipartFile file) {
ImaUpload result = new ImaUpload();
String fileName = file.getOriginalFilename();
fileName=fileName.toLowerCase();
if(!fileName.matches("^.+\\.(jpg||png||gif)$")) {
result.setError(1);
return result;
}
try {
BufferedImage image= ImageIO.read(file.getInputStream());
int height = image.getHeight();
int width = image.getWidth();
if(height==0 ||width==0) {
result.setError(1);
return result;
}
File dirFile = new File(dirPath);
if(!dirFile.exists()) {
dirFile.mkdirs();
}
String uuid= UUID.randomUUID().toString().replace("-", "");
String fileType=fileName.substring(fileName.lastIndexOf("."));
String fileRealPath=dirPath+uuid+fileType;
file.transferTo(new File(fileRealPath));
result.setHeight(height+"");
result.setWidth(width+"");
String realUrlPath=urlPath+uuid+fileType;
result.setUrl(realUrlPath);
return result;
} catch (Exception e) {
result.setError(1);
return result;
}
}
}
图片封装返回对象
package com.test.data;
public class ImaUpload {
private Integer error=0;
private String url;
private String width;
private String height;
public Integer getError() {
return error;
}
public void setError(Integer error) {
this.error = error;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getWidth() {
return width;
}
public void setWidth(String width) {
this.width = width;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
}
3.前台代码 这里我发下我开发测试时的代码,基本确定好上传文件类型,名称与接口一致就行
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/upload" enctype="multipart/form-data"
method="post">
图片:<input type="file" name="file">
<br/>
<input type="submit" value="提交">
</form>
</body>
</html>
负载均衡和反向代理
这里就发下nginx的配置(ps:记住,最好是专业的运维你和他定好标准让他来配)
#image upload
server {
listen 80;
server_name test.image.com.cn;
location / {
root /test/tomcat/data/image_upload;
}
}
ps:如果出现413上传文件过大问题 打开nginx.conf(没权限找运维人员)在http{ }中设置:client_max_body_size 5m,即:
client_max_body_size 5M
linux服务器配置
至此,其实我们开发的工作已基本结束,剩余的第一点linux配置,需要我们在前期跟架构或者项目经理定好方案,后期开发中与运维商量好即可,例如: 1.读写权限就是我们定义的服务器磁盘路径的那个文件夹,一定要开权限支持基本上传和访问 2.二级域名其实就是nginx配置的那个,让运维去申请下(不推荐去用服务器的其他二级域名或者一级域名,这样以后扩展起来相当麻烦) 3…
效果展示 也在努力前行,有问题欢迎指出
|