本文共 2522 字,大约阅读时间需要 8 分钟。
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校验:图片的校验和,通过对接收的传输数据执行散列运算来检查数据的正确性,就是通过一个更短的字符串,来验证整体数据是否正确。
在真正开发项目的时候,编写代码之前,一般都要做两件非常重要的设计:数据库设计和前后端交互接口设计
1)认识JSON
JSON是一种数据组织的格式,格式是键值对的结构 这个项目里使用JSON完成数据的序列化,方便进行网络传输 此处需要使用Gson库,是JSON解析库 2)文件上传操作在HTML中是如何完成的以及在HTTP协议中是如何进行的 需要用到form表单等,客户端上传图片构造一个如这样的请求,服务端也要按照这个格式来解析请求:POST/imageContentType: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 200OKContent-Type;image/pngHTTP/1.1 200OK{ ok:false, reason:"具体的出错原因" }
这是后台开发的主要代码和目录
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保证内存可见转载地址:http://wflzi.baihongyu.com/