基于Java Servlet图片服务器
目录
- 项目简介
- 项目功能
- 项目页面展示
- 数据库设计
- 接口设计
- 新增图片
- 查看所有图片元信息、查看指定图片元信息
- 查看图片内容
- 扩展功能:基于白名单方式的防盗链(简单方法)
- 删除图片接口
项目简介
解决GitHub、博客中插入图片的问题;给定一个url,能够获得图片内容
项目功能
一个HTTP服务器,提供对图片的增删改查功能,同时能够完成上传图片,展示图片。
项目页面展示
选择图片界面
展示图片界面
删除图片界面
查看图片内容界面
数据库设计
设计一张图片表
MySQL脚本
drop table if exists `image_table`;
create table `image_table`(image_id int not null primary key auto_increment,image_name varchar(50),size bigint,upload_time varchar(50),md5 varchar(128),content_type varchar(50) comment '图片类型',path varchar(1024) comment '图片所在路径')
接口设计
下载一个前端代码和文档,根据前端分析来写后端业务
新增图片
根据前端代码,新增接口url为image,重写的是doPost方法
1.解析请求数据,获取图片的每个属性
2.根据md5校验码,验证是否上传过该图片
//获取part(上传图片文件)的输入流InputStream is = p.getInputStream();//获取上传文件的输入流(数据)//根据输入流转md5校验码String md5 = DigestUtils.md5Hex(is);//如果已上传该图片(相同的md5),就不能插入数据和保存本地int num = ImageDAO.queryCount(md5);if(num >= 1){throw new AppException("上传图片重复");}
3.将上传图片保存到本地路径
p.write(IMAGE_DIR+"/"+md5);
4.将图片信息保存到数据库
Image image = new Image();image.setImageName(name);image.setContentType(contentType);image.setSize(size);image.setUploadTime(uploadTime);image.setMd5(md5);image.setPath("/"+md5);int n = ImageDAO.insert(image);
查看所有图片元信息、查看指定图片元信息
这两个接口都是重写doGet方法,查看指定图片信息需要传参数,所以我们可以设计到一个方法中,根据有无参数来判断是查看所有图片还是指定图片
String id = req.getParameter("imageId");Object o = null;//查询所有图片: o=List<Image>if(id == null){o = ImageDAO.queryAll();}else{//查询指定id的一个图片: o=image对象o = ImageDAO.queryOne(Integer.parseInt(id));}
查看图片内容
1.首先要设置响应返回的数据类型要和图片类型保持一致
2.因为图片内容是以二进制方式存储的,所以使用一个字节数组。输入流读出到数组中,输出流再写入
3.一定要刷新,并且关闭输入流、输出流,否则会出现缓冲或者读取不到的问题。
String id = req.getParameter("imageId");Image image=ImageDAO.queryOne(Integer.parseInt(id));resp.setContentType(image.getContentType());String path = ImageServlet.IMAGE_DIR + image.getPath();FileInputStream fis = new FileInputStream(path);OutputStream os = resp.getOutputStream();byte[] bytes = new byte[1024*8];int len;while((len=fis.read(bytes)) != -1){os.write(bytes, 0, len);}os.flush();fis.close();os.close();
扩展功能:基于白名单方式的防盗链(简单方法)
通过 HTTP 请求头中的 Referer字段判定是否是指定网站请求图片.
1.使用HashSet来存储(有唯一性)
private static final Set<String> whiteList = new HashSet<>();static {whiteList.add("http://localhost:8082/java_image_server/");whiteList.add("http://localhost:8082/java_image_server/index.html");}
2.在方法中添加一处判断
String referer = req.getHeader("Referer");if(!whiteList.contains(referer)){//白名单不包含当前请求的Referer,不允许访问resp.setStatus(403);//还可以设置响应体数据return;}
删除图片接口
重写doDelete方法
1.数据库根据id删除图片数据
2.本地磁盘删除图片(在数据库删除之前,先获取图片路径)
本地删除图片使用File
File f = new File(path);f.delete();
基于Java Servlet图片服务器相关推荐
- 基于java的WebGIS服务器的设计
1.基于java的WebGIS服务器设计方案一 看着目前webgis日益流行,有时候我们也想自己搞一个,经过一段时间的摸索,大概搞清楚了怎么弄了 Ajax是今后webgis发展方向.我们的设计思路 ...
- java毕业设计——基于java+Servlet+jsp的网上花店销售系统设计与实现(毕业论文+程序源码)——网上花店销售系统
基于java+Servlet+jsp的网上花店销售系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Servlet+jsp的网上花店销售系统设计与实现,文章末尾附有本毕业设计的 ...
- 基于JAVA黑白图片和上色处理系统(Springboot框架+AI人工智能) 开题报告
本科生毕业论文 基于Java(springboot框架)黑白图片和上色处理系统 开题报告 学 院: 专 业: 计算机科学与技术 年 级: 学生姓名: 指导教师: XXXX大学 ...
- java图片管理系统_基于Java的图片管理信息系统的设计与实现
收稿日期:2003 - 05 - 07 作者简介:谭 娜(1978 -) ,女 ,河南济源人 ,硕士研究生 ,主要研究方向为数据库理论与应用. 基于 Java 的图片管理信息系统的设计与实现 谭 娜1 ...
- 基于JAVA的图片相似度比对
前言 一.工程简介 基于Java的图片相似度对比,有前台页面,后台算法 二.适用场景 图像处理实习 三.所用软件 此次工程,所用软件图片所示: 四.工程介绍
- 一个基于Java的syslog服务器,大家都来看看啊!
一个基于Java的syslog服务器 前言 前期准备 功能效果图 接收到的数据只能输出到控制台的问题解决方法 具体代码 结语 前言 当时接到要开发syslog功能时,我的表情是这样的- 啥是syslo ...
- [Jetty]基于Java Servlet的支持WebSocket的服务器
1. JDK安装 www.java.com/zh/download 2. Jetty下载与安装 download.eclipse.org/jetty,下载稳定版,解压到目标路径 2.1 启动Jetty ...
- 微信公众号的开发:基于Java版本的服务器(1)
目录 1.准备工作 产生原因: 基本流程: 本地的内网穿透工具用的是花生壳的免费的 代码展示: 基于基本的springboot 结果显示:成功之后,提交按钮就会消失: 1.准备工作 强制条件:开通申请 ...
- 基于java的http服务器
1.java.net.Socket java.net.ServerSocket 2.在http中,始终都是客户端通过建立连接和发送一个HTTP请求从而开始一个事务.Web服务器不需要联系客户端或对客户 ...
- 基于JAVA+Servlet+JSP+MYSQL的网上心理咨询系统
技术:java.jsp.jdbc 数据库:mysql web服务器:Tomcat 集成开发工具:myeclipse
最新文章
- windows mobile设置插移动卡没反应_ipad pro外接移动硬盘ipados
- [Bat]UNC路径不支持的2种解决方法
- 清除2960交换机的配置
- 经典html5网页,HTML5网页设计经典
- VTK:IO之ReadDICOMSeries
- 【干货】比赛后期大招之stacking技术分享
- Python之isinstance
- Flask 框架 是 Python 中最流行的 Web 框架之一
- spark提交任务的两种的方法
- 文献学习笔记丨转录组表达数据的生信挖掘研究
- 微信小程序开发实战第六讲之手机号验证码登录
- 荣耀Magic 3Pro 充电架构分析
- i.MX6ULL系统移植:Linux移植6 - Linux 内核移植
- ​分享|Tiktok小店入驻如何选择​
- 图像评价常用指标(PSNR、SSIM、LPIPS 、FID、Recall)
- 手机摄影中多摄融合理论详解与代码实战
- mysql 自动生成时间戳
- 一文理顺离散信号的傅里叶变换
- C/C++文件输入输出(详细介绍)
- 使用html+css完成仿站操作要点
热门文章
- APK文件如何查看源代码
- 在https://m.baidu.com/百度搜索框中输入文字点击搜索,出现如下错误:Message: element not interactable.
- 数显之家快讯:【SHIO世硕心语】2021,写给自己的几段宽心话!
- LOJ#2155. 「POI2011 R1」同谋者 Conspiracy
- java retained size_使用MAT时的Shallow Size和 Retained Size的区别
- 愿得一人心——祭奠······埋葬我218的爱情
- 小红书七夕营销攻略,玩出新花样(内附小红书推广方案干货)
- mysql 临时表 会话级_会话级的临时表和事务级的临时表
- 春节微信大数据出炉,带封面微信红包收发个数超50亿
- BZOJ1189 [HNOI2007]紧急疏散evacuate