IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 分布式项目上传文件(上传图片) -> 正文阅读

[系统运维]分布式项目上传文件(上传图片)

这篇文章不只是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

/**
	 * 图片上传
	 * {"error":0,"url":"图片的保存路径","width":图片的宽度,"height":图片的高度}
	 * @param file 提交的文件
	 * @return
	 */
	@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="D:/image_upload/";   //本地磁盘路径
    private static String dirPath="/test/tomcat/data/image_upload/";   //测试服本地磁盘路径
    private static String urlPath="http://test.image.com.cn/";	//测试服虚拟路径

    /**
     * 1.判断文件是否为jpg||png||gif
     * 2.判断文件是否为.exe或其他恶意程序
     * 3.设立uuid随机数防止图片重名
     */
    public static ImaUpload uploadFile(MultipartFile file) {
        ImaUpload result = new ImaUpload();
        //获取当前文件名进行正则判断  abc.jpg
        String fileName = file.getOriginalFilename();
        //将文件名转为小写
        fileName=fileName.toLowerCase();
        if(!fileName.matches("^.+\\.(jpg||png||gif)$")) {
            result.setError(1);
            return result;
        }
        /** 判断文件是否为.exe或其他恶意程序 */
        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();
            }
            //给文件改名
            //设置uuid
            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); //将虚拟路径返回,本地测试将realUrlPath替换为fileRealPath
            return result;
        } catch (Exception e) {
            result.setError(1);
            return result;
        }
    }   
}

图片封装返回对象

package com.test.data;

/**
 * 上传图片封装对象
 */
public class ImaUpload {
    private Integer error=0;		//图片上传错误标识 0表示无异常,1代表异常
    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…

效果展示
在这里插入图片描述也在努力前行,有问题欢迎指出在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:38:53  更:2021-07-27 16:40:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 10:44:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计