Nginx反向代理实现图片上传到Ubuntu服务器

本文介绍了如何通过Nginx搭建一个图片操作服务器,配合Apache实现图片上传和获取。首先创建一个SpringBoot应用处理图片上传,然后配置Nginx进行反向代理,将图片请求转发到不同的服务器。最后展示了如何在主服务器上通过接口实现图片上传功能。
摘要由CSDN通过智能技术生成

之前用Apache搭建了一个静态图片服务器,服务器搭建步骤见这篇博客
https://blog.csdn.net/weixin_44996854/article/details/117046225
但只实现了通过网址从服务器获取图片的功能,而且每次只能根据网址获取单张图片,并不能上传文件到服务器。要实现图片的上传,就需要再新建一个图片处理的服务器,而其他服务器可以通过这个服务器来上传图片和获取图片,这就涉及到了多台服务器的相互配合,而使用Nginx的反向代理功能可以很方便地解决这个问题。

  1. Nginx的下载和安装
  2. 图片操作服务器的搭建
    新建一个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/
  1. 修改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/图片操作服务器
  1. 主服务器新建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路径就可以实现图片的上传了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值