关于商品新增文件模块说明
- 用户点击添加商品按钮时,首先获取分类三级列表信息,跳转到商品新增页面
- 用户登入基本的商品信息
- 用户录入价格时,需要再后期将数据扩大100倍
商品上传
- 当用户点击上传图片时,根据属性名称file=“图片字节信息“,实现数据的传递。
- 后端通过特定的接口MultipartFile(mvc专门接收字节信息,内部封装io流)
- 上传文件时,首先正则表达式判断文件类型 .jpg.png.git
- 要判断图片是否为木马病毒,对于图片 ImageIO.read(file.getInputStream()) 进行高和宽的判断,如果有一个为0则上传的不是图片。
- 将上传的图片进行分目录存储,采取策略按照时间日期进行的目录分割
- 为了防止文件命名重复,采用UUid的方式重新定义文件名称
- 最终实现文件上传,返回特定的vo数据 供前端展现
商品详情
- 通常商品信息和详情信息是分开维护的.由于商品详情是大字段(文本域),查询的效率低.
- 商品表与详情表是一对一的对应关系. 设计时 item.id=itemDesc.id.
- 之后利用富文本编辑器(所见即所得),展现详情信息,其中存储的是html代码片段.
@Service
public class FileServiceImpl implements FileService{
//封装路径的前缀
private String localDir = "G:/images";
private String preUrl = "http://image.jt.com";
/**
* 完成校验:
* 1.校验是否为图片
* 2.木马.exe.jpg 判断是否满足图片固有属性 高度/宽度
* 3.为了提高查询效率,要求分目录存储.
* 3.1 按照后缀名分配 jpg,png,gif 效率提升不能满足要求
* 3.2 按照日期分 yyyy/MM/dd/HH 可以
* 3.3 商品分类 出现分布不均现象.
* 3.4 根据名称hash 之后截串
* demo: hash(a)=qw|er|as|dg/a.jpg
* 弊端: hash码可能出现分布不均的现象.
* 4.防止文件重名 使用uuid代替名称
* @param file
* @return
*/
@Override
public ImageVO upload(MultipartFile file) {
//1.获取图片名称 demo: abc.jpg abc.JPG
String fileName = file.getOriginalFilename();
//bug说明: 由于windows系统不区分大小写,所以将字母全部转化为小写
fileName = fileName.toLowerCase();
//利用正则判断是否为图片.
if(!fileName.matches("^.+\\.(jpg|png|gif)$")){
//如果不是图片,则返回null
return null;
}
//2.检查文件是否为恶意程序.
try {
BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
if(width == 0 || height == 0){
//说明文件不是图片.
return null;
}
//3.根据时间实现目录的创建 时间--yyyy/MM/dd
String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
.format(new Date());
// "G:/images/2021/11/11
String localDirPath = localDir + dateDir;
//创建目录
File dirFile = new File(localDirPath);
if(!dirFile.exists()){
dirFile.mkdirs();
}
//4. 使用uuid替换文件名称 唯一:系统内部唯一
String uuid = UUID.randomUUID().toString()
.replace("-","");
//截取文件的后缀 aa.bb.cc.jpg
int index = fileName.lastIndexOf(".");
//获取类型 .jpg
String fileType = fileName.substring(index);
String newFileName = uuid + fileType;
//5.实现文件上传操作 目录/文件名称
String realFilePath = localDirPath + newFileName;
file.transferTo(new File(realFilePath));
System.out.println("文件上传成功!!!");
/*
* 6.封装返回值
* 封装虚拟路径 在各个系统之间可以灵活切换,只保存动态变化的目录
* path = 时间/uuid.type
* 网络地址://http://image.jt.com/2021/11/11/a.jpg
*/
String virtualPath = dateDir + newFileName;
String url = preUrl + virtualPath;
System.out.println("磁盘地址:"+realFilePath);
System.out.println("网络地址:"+url);
return new ImageVO(virtualPath,url,newFileName);
} catch (IOException e) {
e.printStackTrace();
return null; //表示程序有问题
}
}
/**
* 实现思路:
* 1.根据虚拟地址,拼接磁盘地址
* 2.判断文件是否存在
* 3.实现文件删除
* @param virtualPath
*/
@Override
public void deleteFile(String virtualPath) {
//1.生成本地磁盘地址
String path = localDir + virtualPath;
System.out.println(path);
File file = new File(path);
if(file.exists()){
file.delete();
}
}
}
如果路径信息会发生变化,则最好的方式通过动态赋值的方式完成.
编辑image.properties文件
#通过配置文件 动态赋值 image.localDir=G:/images image.preUrl=http://image.jt.com
?代理机制
用户如果直接通过网络地址进行访问,是无法直接获取图片信息的,如果需要获取图片应该实现域名与地址的映射
反向代理:
- 反向代理服务器位于用户和服务器之间
- 用户访问反向代理服务器,就可以获取真实的资源
- 反向代理机制,用户无需了解真实的服务器信息
- 反向代理保护了服务器端信息,也称之为服务器代理
正向代理:
1.正向代理服务器位于用户和服务器之间. 2. 用户发起请求时,非常明确自己访问的服务器到底是谁 3. 真实的服务器不清楚真实的用户是谁.保护了用户的信息. 所以称之为客户端代理.
:用户每一次请求都包含了正向代理和反向代理. 正向代理一般适用于网络的通信. 反向代理一般适用于服务器获取信息.
?Nginx介绍
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,俄罗斯
- ?Nginx是非常优秀的反向代理服务器
- ?Nginx占用内存小,不到2M? tomcat服务器占用内存200M左右
- 并发负载能力强3-5万次每秒,tomcat并发能力250-500次每秒,进行调优可以实现1000次每秒
- nignx可以当作负载均衡服务器使用
Nginx官网下载
nginx启动时会默认占用80端口
启动关闭
关于启动2项说明:
在windows中nginx服务每次点击启动之后,都会生成2个进程项 进程项1: nginx主要进程信息. 进程项2: nginx的守护进程 主要的任务防止主进程意外关闭. 关闭nginx 应该先关闭守护(内存晓得)再关闭主进程(内存大的).
命令: 1. 启动命令 start nginx 2. 重启命令 nginx -s reload 3. 关闭命令 nginx -s stop
业务说明
磁盘地址:G:/images/2021/09/09/a.jpg 网络地址:http://image.jt.com/2021/09/09/a.jpg
问题: 如何通过网络地址访问磁盘的图片?
1.用户通过域名访问真实的服务器. 2.nginx根据自身的配置进行拦截,根据配置文件将域名http://image.jt.com转化为具体的磁盘地址 3.根据磁盘地址访问真实的服务器资源. 4/5. 服务器将数据交给nginx,之后nginx将数据返回给用户.至此实现了反向代理. ?
修改hosts文件
路径: C:\Windows\System32\drivers\etc
#? IP 与?? 域名映射 #?? ?127.0.0.1?????? localhost #?? ?::1???????????? localhost
#图片服务器配置 127.0.0.1?????? image.jt.com #前端服务器配置 127.0.0.1?????? www.jt.com #后端服务器配置 127.0.0.1?????? manage.jt.com
|