图片服务器
一、项目需求
大家在写博客的时候,是怎么插入图片的呢?
事实上,大家写博客的时候,插入的图片,本质上是往文章中放入了一个链接(URL),而资源对应在另外的一个服务器上。
而我也写了那么多天的博客了,我的博客上也有不少图。我想利用自己所学的知识,自己写一个简单的图片服务器来实现github / 博客中插入图片的问题。
核心功能:
本项目的结构分为两部分,数据存储部分和服务器模块,使用MySQL存储图片的属性,将图片内容保存到本地磁盘,服务器向外提供上传图片、获取图片的属性、根据图片的URL获取图片内容和删除图片等API接口。
整体构架:
实现一个 HTTP 服务器,完成对图片的上传、查看(查看属性/内容)、删除操作。
实现一个简单的页面来上传、展示当前的图片。
重要知识点:
- 简单的Web服务器设计开发能力(Servlet 的使用)
- 使用数据库(MySQL)JDBC 操作 MySQL
- 数据库设计(根据实际场景设计数据库表结构)
- 前后端交互的 API 的设计(基于HTTP协议)
- 认识 JSON 数据格式,学习使用 Java 中的 Gson 这个库操作 JSON 数据
- 强化 HTTP 协议的理解,学习测试 HTTP 服务器,Postman 工具的使用
- 基于 md5 进行校验
- 使用 HTML CSS JavaScript 技术构建一个简单的网页
二、数据库设计
MySQL:
MySQL 本质上也是有一个 服务器 程序;
之前安装数据库,既安装了服务器(本体)(存数据的地方),也安装了客户端(命令行程序);
虽然客户端 与 服务器 安装在同一台机子上,但依旧是通过网络的方式传输。
(MySQL客户端 通过网络的方式 来访问 服务器)(可以有另外的客户端 访问这个服务器);
它既然是个服务器,就可以有很多个客户端同时访问。
创建文件 db.sql
//进入数据库
mysql -uroot -p
// 创建数据库 java_image_server
create database java_image_server;
//切换数据库
use java_image_server;
//建表
CREATE TABLE `image_table` (
`imageId` int(11) NOT NULL AUTO_INCREMENT,
`imageName` varchar(50) DEFAULT NULL,
`size` int(11) DEFAULT NULL,
`uploadTime` varchar(50) DEFAULT NULL,
`contentType` varchar(50) DEFAULT NULL COMMENT '图片类型',
`path` varchar(1024) DEFAULT NULL,
`md5` varchar(1024) DEFAULT NULL,
PRIMARY KEY (`imageId`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8
contentType:正文类型("text/html"、"image/jpg"、"image/png" 等)
path:数据库中存储的 图片 的属性
图片正文是以文件的形式直接存在磁盘上的
数据库中就记录一个 path,这个 path 就对应到磁盘上的文件
md5:图片的 md5 校验和
校验和:通过一个更短的字符串,来验证整体数据是否正确。
短的字符串是根据原串内容通过一定的规则来计算出来的。
什么是 md5? MD5_百度百科
这是一种常见字符串 hash 算法, 具有三个特性:
1. 不管源字符串多长, 得到的最终 md5 值都是固定长度
2. 源字符串稍微变化一点点内容, md5 值会变化很大(降低冲突概率)
3. 通过原字符串很容易计算得到 md5 值, 但是根据 md5 推导出原字符串很难(几乎不可能)
查看表结构:
三、服务器 API 设计(前后端交互接口设计)
图片存储分为了两个部分,首先就是我们上传的图片信息(包括大小,名字等)这些可以用数据库来进行存储,图片内容部分以二进制方式进行存储。但是由于图片信息存储如果用类进行存储改动比较麻烦,所以就引入了 JSON 格式进行存储。
Json 是一种常见是数据格式组织方式,一种键值对风格的数据格式,方便修改。
(键值对的结构:键不能重复,根据键能够查到值)
Java 中可以使用 Gson 库来完成 Json 的解析和构造。
Gson:goole 搞的一个开源的 JSON 解析库。
在 Maven 中新增 Gson 的依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>