图片服务器——数据库设计和服务器API设计

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保证内存可见
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值