之前用Apache搭建了一个静态图片服务器,服务器搭建步骤见这篇博客
https://blog.csdn.net/weixin_44996854/article/details/117046225
但只实现了通过网址从服务器获取图片的功能,而且每次只能根据网址获取单张图片,并不能上传文件到服务器。要实现图片的上传,就需要再新建一个图片处理的服务器,而其他服务器可以通过这个服务器来上传图片和获取图片,这就涉及到了多台服务器的相互配合,而使用Nginx的反向代理功能可以很方便地解决这个问题。
- Nginx的下载和安装
- 图片操作服务器的搭建
新建一个SpringBoot服务器,端口设为8200,作为操作图片的服务器,主要代码如下:
@RestController
@RequestMapping(value = "upload")
public class API {
/**
* 访问服务器文件路径端口
*/
@Value(value = "${filePath}")
private String imgPath;
/**
* 服务器保存文件路径
*/
@Value(value = "${uploadHost}")
private String uploadHost;
@GetMapping("/")
public String welcome() {
return "welcome to pic_server";
}
/**
* 项目host路径
*/
@PostMapping(value = "/upImg")
public JSONObject upImg(@RequestBody String json) {
JSONObject jsonObject = new JSONObject();
byte[] bfile = JSONObject.parseObject(json).getBytes("data");
String fileName = JSONObject.parseObject(json).getString("fileName");
byte2File(bfile, uploadHost, fileName);
if (json.isEmpty()) {
return null;
}
try {
System.out.println("上传成功");
jsonObject.put("data", imgPath + fileName);
return jsonObject;
} catch (Exception e) {
System.out.println("上传失败");
jsonObject.put("message", e.toString());
}
return jsonObject;
}
//byte数组转file文件方法
public static void byte2File(byte[] bfile, String filePath, String fileName) {
BufferedOutputStream bos = null;
FileOutputStream fos = null;
File file = null;
try {
File dir = new File(filePath);
if (!dir.exists() && !dir.isDirectory()) {//判断文件目录是否存在
dir.mkdirs();
}
file = new File(filePath + fileName);
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(bfile);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
try {
if (bos != null) {
bos.close();
}
if (fos != null) {
fos.close();
}
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
}
application文件内容如下:
server.port=8200
#访问服务器文件路径端口
filePath=http://hikari.top/images/
#服务器保存文件路径
uploadHost=/usr/share/images/
- 修改Nginx的配置文件
Nginx的总配置文件是 /etc/nginx/下的nginx.conf文件,文件中可以看到下面代码
图中第一行代表配置文件会加载conf.d下的所有后缀为.conf的文件。因此我们在conf.d文件夹下新建一个new_file.conf文件,并添加如下代码
server {
listen 80;
server_name 你的服务器域名;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://127.0.0.1:8080/; #(这里最后的“/”不能少,否则会出错)
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
location /images {
proxy_pass http://127.0.0.1:8100/images/;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
location /pic_server {
proxy_pass http://127.0.0.1:8200/;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
这里我们设置了三个转发,从上往下分别是主服务器,Apache静态图片服务器,图片操作服务器。配置完成之后使用如下命令重新加载nginx文件
sudo nginx -s reload
就可以通过网址的方式访问到这几个服务器了,分别对应如下:
网址 | 服务器地址 | 服务器名称 |
---|---|---|
www.域名地址/images/ | http://127.0.0.1:8100/images/ | 主服务器 |
www.域名地址/ | http://127.0.0.1:8080/ | 静态图片服务器 |
www.域名地址/pic_server/ | http://127.0.0.1:8200/ | 图片操作服务器 |
- 主服务器新建PictureController类并添加如下代码
@RestController
@CrossOrigin
public class PictureController {
@PostMapping(value = "/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return "失败";
}
JSONObject postData = new JSONObject();
String fileName = file.getOriginalFilename();//上传的文件名
String suffixName = fileName.substring(fileName.lastIndexOf("."));//获取后缀
fileName = UUID.randomUUID() + suffixName;//生成唯一文件名
try {
byte[] fileBytes = file.getBytes();//转换为byte数组
postData.put("fileName",fileName);
postData.put("data",fileBytes);
RestTemplate client = new RestTemplate();
//FilePath是你服务端的项目接口路径
JSONObject json = client.postForEntity("http://你得服务器地址/pic_server/upload/upImg", postData, JSONObject.class).getBody();
System.out.println("上传成功");
return (String) json.get("data");//返回文件下载地址
} catch (IOException | JSONException e) {
System.out.println(e.toString());
}
System.out.println("上传失败");
return "失败";
}
}
客户端通过访问/upload路径就可以实现图片的上传了。