图片服务器项目
项目源码:image server
一.核心功能
1.上传图片
2.展示图片
3.删除图片
4.复制图片地址,在另外的服务器打开
二.核心知识点
1.Web服务器(Http服务器)设计开发能力(Servlet)
Servlet是Tomcat这个Http服务器所提供的一组编程接口,可以去开发一些自己的逻辑,然后部署到Tomcat上去,就可以完成自己的服务器的搭建
2.服务器要有一定的存储能力,使用JDBC操作Mysql数据库
3.根据实际情况来设计数据库表结构
4.前后端交互的API设计(基于HTTP协议)
5.JSON数据格式,使用java中的gson这个库操作json数据
6.测试HTTP服务器(postman测试)
7.使用HTML+CSS+JavaScript技术构建一个简单的页面
三.服务器设计
1.数据库设计
数据库中存储的是图片的属性。
图片正文,以文件的形式直接存在磁盘上,数据库中就记录一个path对应到磁盘上的文件
在创建存放图片属性表中有个md5字段:
md5:
①做图片的md5校验和(校验和:通过一个更短的字符串来验证整体数据是否正确,这个短的字符串是根据原串的内容通过一定的规则计算出来的)
②字符串哈希算法:将字符串经过一系列的数学变换,得到一个整数,再映射到数组的下标
表的设计:
2.前后端交互接口设计(API设计)
①JSON
是一种数据组织的格式,和编程语言无关。是一种键值对的结构。通过JSON可以完成数据的序列化,方便进行网络传输。
在java中有个库叫Gson,开源的JSON解析库
示例代码1:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.HashMap;
public class TestGson {
public static void main(String[] args) {
HashMap<String,Object> hashmap=new HashMap<>();
hashmap.put("name","曹操");
hashmap.put("skill1","剑气");
hashmap.put("skill2","三段跳");
hashmap.put("skill3","加攻速");
hashmap.put("skill4","吸血");
//通过map转成JSON结构的字符串
//1.创建一个gson对象
Gson gson=new GsonBuilder().create();
//2.使用toJson方法将键值对结构转成JSON字符串
String str=gson.toJson(hashmap);
System.out.println(str);
}
}
运行结果:
示例代码2:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
class Hero{
public String name;
public String skill1;
public String skill2;
public String skill3;
public String skill4;
}
public class TestGson {
public static void main(String[] args) {
Hero hero=new Hero();
hero.name="曹操";
hero.skill1="剑气";
hero.skill2="三段跳";
hero.skill3="加攻速";
hero.skill4="吸血";
//1.创建一个gson对象
Gson gson=new GsonBuilder().create();
//2.使用toJson方法将对象转成JSON字符串
String str=gson.toJson(hero);
System.out.println(str);
}
}
运行结果:
②文件上传操作在HTML中是如何上传的
文件上传在HTTP协议中是如何进行的?
用到form表单:将网页上的数据通过HTTP协议提交到服务器端
③新增图片API
客户端请求:
POST /image
Content-Type: multipart/form-data;
[正文内容]
图片的二进制内容
服务器响应:
上传成功:
HTTP/1.1 200 OK
{
“ok”:true,
}
上传失败:
HTTP/1.1 200 OK
{
“ok”:false,
“reason”:“具体的失败原因”
}
④查看所有图片信息API(查属性)
客户端请求:
GET /image
服务器响应:
获取成功:
HTTP/1.1 200 OK
[
{
imageId:1,
imageName:“1.png”,
contentType:“image/png”,
size:1000,
uploadTime:“20200222”,
path:"./data/1.png",
md5:“222333444”,
},
{
…
}
]
获取失败:
HTTP/1.1 200 OK
[ ]
⑤查看指定图片信息API(查属性)
客户端请求:
GET /image?imageId=具体的数值
服务器响应:
获取成功:
HTTP/1.1 200 OK
{
imageId:1,
imageName:“1.png”,
contentType:“image/png”,
size:1000,
uploadTime:“20200222”,
path:"./data/1.png",
md5:“222333444”,
}
获取失败:
HTTP/1.1 200 OK
{
“ok”:false,
“reason”:“具体出错原因”
}
⑤删除指定图片API
客户端请求:
DELETE /image?imageId=[图片id]
服务器响应:
删除成功:
HTTP/1.1 200 OK
{
“ok”:true,
}
删除失败:
HTTP/1.1 200 OK
{
“ok”:false,
“reason”:“具体的失败原因”
}
⑤查看指定图片内容API
客户端请求:
GET /imageShow?imageId=图片id
服务器响应:
成功
HTTP/1.1 200 OK
Content-Type:image/png
[图片的二进制内容]
失败
HTTP/1.1 200 OK
{
ok:false,
reason:“具体的原因”
}
四.后端代码设计
1.封装数据库操作(DAO层)
①DBUtil: 封装获取数据库连接,关闭数据库连接的操作
②Image实体类:对应到一张图片(属性和一系列的get和set方法)
③ImageDao: Image对象的管理器,借助这个类完成Image对象的增删等操作
2.基于servlet搭建服务器
Tomcat是一个HTTP服务器
①安装servlet(在pom.xml里添加servlet依赖)
②创建一个类,继承自HttpServlet父类并且重写这个类中的一些重要的方法
HttpServlet中的一些方法
doGet方法的两个参数:
HttpServletRequest req: 有请求的相关信息(方法,url,各种header,body)
HttpServletResponse resp:有响应的相关信息(状态码,各种header,body)
代码写完之后,要在web.xml中将新建的Servlet注册进去
配置好上述就是可以将收到的请求中的某个路径去对应到servlet类,进一步执行对应的代码
Tomcat工作原理
a>启动的时候绑定一个端口号(8080)
b>进入一个主循环
c>在主循环里,调用accept,获取到当前的请求连接
d>读取客户端发送的数据(字符串)
e>把这个字符串按照HTTP协议来进行解析
f>解析出的HTTP请求的方法和url之后,找到对应的Servlet,并且去执行对一个的doXXX方法
③实现图片上传
用到一个第三方库fileupload