1.数据库设计
1)首先创建名为java_image-server的数据库
create database java_image_server;
2)创建名为image_table的表存储图片的属性信息
create table image_table(imageId int not null primary key auto_increment,
imageName varchar(50),
size int,
uploadTime varchar(50),
contentType varchar(50),
path varchar(1024),
md5 varchar(1024));
3)查看表的属性信息
设置ImageId为自增主键,数据库中存储的是图片的属性(元信息)。
图片的正文是以文件的形式直接存在磁盘上的,数据库中就记录一个path对应到磁盘上的文件。
MD5校验:图片的校验和,通过对接收的传输数据执行散列运算来检查数据的正确性,就是通过一个更短的字符串,来验证整体数据是否正确。
2.服务器API设计
在真正开发项目的时候,编写代码之前,一般都要做两件非常重要的设计:数据库设计和前后端交互接口设计
1)认识JSON
JSON是一种数据组织的格式,格式是键值对的结构
这个项目里使用JSON完成数据的序列化,方便进行网络传输
此处需要使用Gson库,是JSON解析库
2)文件上传操作在HTML中是如何完成的以及在HTTP协议中是如何进行的
需要用到form表单等,客户端上传图片构造一个如这样的请求,服务端也要按照这个格式来解析
请求:
POST/image
ContentType:multipart/form-data;
3)正式的API设计
新增图片
请求:
POST/image
响应: 上传成功
HTTP/1.1 200OK
{
"ok":true,
}
上传失败
HTTP/1.1 200OK
{
"ok":false;
"reason":"具体的失败原因"
}
查看所有图片属性
请求:GET/image
响应:
HTTP1.1 200OK
{
{
imageId:1,
ImageName:"1.png",
contentType:"image/png",
size=1000,
uploadTime="20200319",
path="./data/1.png”,
md5:”11223344“,
},
{
.......
}
}
查看指定图片属性
请求:
GET/image?imageId=[具体的图片id]
响应:
HTTP/1.1 200OK
{
imageId:1,
ImageName:"1.png",
contentType:"image/png",
size=1000,
uploadTime="20200319",
path="./data/1.png”,
md5:”11223344“,
}
HTTP/1.1 200OK
{
ok:false
reason:"具体的出错原因"
}
删除指定图片
请求:DELETE/image?imageId=[具体的图片id]
响应:
HTTP/1.1 200OK
{
ok:true,
}
HTTP/1.1 200OK
{
ok:false,
reason:"具体的出错原因"
}
查看指定图片内容
请求:
GET/imageShow?imageId=[具体的图片id]
响应:
HTTP/1.1 200OK
Content-Type;image/png
HTTP/1.1 200OK
{
ok:false,
reason:"具体的出错原因"
}
3. 代码设计
这是后台开发的主要代码和目录
1)api层里是前后端交互的API.ImageServlet主要实现的是对图片的查看,删除等功能,而imageShowServlet是实现前端页面对图片的展示功能
2)common里放的是我们自定义的一个异常
3)dao层里放的主要是获取数据库连接的相关操作
1)这里我们需要注意的是在使用JDBC连接数据库的时候需要注意关闭顺序,对Connection,Statement,ResultSet的关闭顺序,先连接的需要后关闭
public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet){
try {
if(resultSet!=null){
resultSet.close();
}
if(statement!=null){
statement.close();
}
if(connection!=null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2)解决线程安全的步骤
线程安全问题:线程可能会出现CPU的抢占,从而导致线程不安全
加锁 ,双重判定,使用volatile保证内存可见