目录

  • 项目简介
  • 项目功能
  • 项目页面展示
  • 数据库设计
  • 接口设计
    • 新增图片
    • 查看所有图片元信息、查看指定图片元信息
    • 查看图片内容
      • 扩展功能:基于白名单方式的防盗链(简单方法)
    • 删除图片接口

项目简介

解决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图片服务器相关推荐

  1. 基于java的WebGIS服务器的设计

    1.基于java的WebGIS服务器设计方案一   看着目前webgis日益流行,有时候我们也想自己搞一个,经过一段时间的摸索,大概搞清楚了怎么弄了 Ajax是今后webgis发展方向.我们的设计思路 ...

  2. java毕业设计——基于java+Servlet+jsp的网上花店销售系统设计与实现(毕业论文+程序源码)——网上花店销售系统

    基于java+Servlet+jsp的网上花店销售系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Servlet+jsp的网上花店销售系统设计与实现,文章末尾附有本毕业设计的 ...

  3. 基于JAVA黑白图片和上色处理系统(Springboot框架+AI人工智能) 开题报告

      本科生毕业论文 基于Java(springboot框架)黑白图片和上色处理系统 开题报告 学    院: 专    业: 计算机科学与技术 年    级: 学生姓名: 指导教师:   XXXX大学 ...

  4. java图片管理系统_基于Java的图片管理信息系统的设计与实现

    收稿日期:2003 - 05 - 07 作者简介:谭 娜(1978 -) ,女 ,河南济源人 ,硕士研究生 ,主要研究方向为数据库理论与应用. 基于 Java 的图片管理信息系统的设计与实现 谭 娜1 ...

  5. 基于JAVA的图片相似度比对

    前言 一.工程简介 基于Java的图片相似度对比,有前台页面,后台算法 二.适用场景 图像处理实习 三.所用软件 此次工程,所用软件图片所示: 四.工程介绍

  6. 一个基于Java的syslog服务器,大家都来看看啊!

    一个基于Java的syslog服务器 前言 前期准备 功能效果图 接收到的数据只能输出到控制台的问题解决方法 具体代码 结语 前言 当时接到要开发syslog功能时,我的表情是这样的- 啥是syslo ...

  7. [Jetty]基于Java Servlet的支持WebSocket的服务器

    1. JDK安装 www.java.com/zh/download 2. Jetty下载与安装 download.eclipse.org/jetty,下载稳定版,解压到目标路径 2.1 启动Jetty ...

  8. 微信公众号的开发:基于Java版本的服务器(1)

    目录 1.准备工作 产生原因: 基本流程: 本地的内网穿透工具用的是花生壳的免费的 代码展示: 基于基本的springboot 结果显示:成功之后,提交按钮就会消失: 1.准备工作 强制条件:开通申请 ...

  9. 基于java的http服务器

    1.java.net.Socket java.net.ServerSocket 2.在http中,始终都是客户端通过建立连接和发送一个HTTP请求从而开始一个事务.Web服务器不需要联系客户端或对客户 ...

  10. 基于JAVA+Servlet+JSP+MYSQL的网上心理咨询系统

    技术:java.jsp.jdbc 数据库:mysql web服务器:Tomcat 集成开发工具:myeclipse

最新文章

  1. windows mobile设置插移动卡没反应_ipad pro外接移动硬盘ipados
  2. [Bat]UNC路径不支持的2种解决方法
  3. 清除2960交换机的配置
  4. 经典html5网页,HTML5网页设计经典
  5. VTK:IO之ReadDICOMSeries
  6. 【干货】比赛后期大招之stacking技术分享
  7. Python之isinstance
  8. Flask 框架 是 Python 中最流行的 Web 框架之一
  9. spark提交任务的两种的方法
  10. 文献学习笔记丨转录组表达数据的生信挖掘研究
  11. 微信小程序开发实战第六讲之手机号验证码登录
  12. 荣耀Magic 3Pro 充电架构分析
  13. i.MX6ULL系统移植:Linux移植6 - Linux 内核移植
  14. ​分享|Tiktok小店入驻如何选择​
  15. 图像评价常用指标(PSNR、SSIM、LPIPS 、FID、Recall)
  16. 手机摄影中多摄融合理论详解与代码实战
  17. mysql 自动生成时间戳
  18. 一文理顺离散信号的傅里叶变换
  19. C/C++文件输入输出(详细介绍)
  20. 使用html+css完成仿站操作要点

热门文章

  1. APK文件如何查看源代码
  2. 在https://m.baidu.com/百度搜索框中输入文字点击搜索,出现如下错误:Message: element not interactable.
  3. 数显之家快讯:【SHIO世硕心语】2021,写给自己的几段宽心话!
  4. LOJ#2155. 「POI2011 R1」同谋者 Conspiracy
  5. java retained size_使用MAT时的Shallow Size和 Retained Size的区别
  6. 愿得一人心——祭奠······埋葬我218的爱情
  7. 小红书七夕营销攻略,玩出新花样(内附小红书推广方案干货)
  8. mysql 临时表 会话级_会话级的临时表和事务级的临时表
  9. 春节微信大数据出炉,带封面微信红包收发个数超50亿
  10. BZOJ1189 [HNOI2007]紧急疏散evacuate