Jsp+Servlet实现图片上传和点击放大预览功能(提供Gitee源码)

前言:在最近老项目的开发中,需要做一个图片上传和点击放大的功能,在Vue和SpringBoot框架都有现成封装好的组件和工具类,对于一些上世纪的项目就没这么方便了,所以需要自己用原生的代码去编写,这里分享一下我的完整代码,亲测可用。

目录

一、项目截图

二、功能演示

三、JSP页面完整代码

四、Servlet完整代码

五、Gitee源码


一、项目截图

注:需要自行引入以下这四个文件

二、功能演示

点击选择文件

 上传成功后

单击图片放大预览

三、JSP页面完整代码

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head><title>文件上传</title><script type="text/javascript" src="jquery-3.7.1.min.js"></script>
</head>
<body>
<div id="image-preview"></div>
<inputtype="file"id="upload-input"accept="image/*"onchange="uploadImage()"
/>
<div id="outerDiv" style="position:fixed;top:0;left:0;background:rgba(0,0,0,0.7);z-index:2;width:100%;height:100%;display:none;"><div id="innerDiv" style="position:absolute;"><img id="bigImg" style="border:5px solid #fff;" src=""/></div>
</div>
</body>
<script>function uploadImage() {const input = document.getElementById("upload-input");const file = input.files[0];if (file) {const reader = new FileReader();reader.onload = function (event) {const code = event.target.result;uploadFile(file,code);};reader.onerror = function (error) {console.error("Error reading the file:", error);};reader.readAsDataURL(file);}}function uploadFile(file,code){const formData = new FormData();formData.append("file", file);$.ajax({url: 'upload',type: 'POST',data: formData,async: false,cache: false,processData: false,// 告诉jQuery不要去处理发送的数据contentType: false, // 告诉jQuery不要去设置Content-Type请求头success:function(res){let imageContainer = document.getElementById('image-preview');let uploadedImage = document.getElementById('uploaded-image');if (uploadedImage) {// 如果已经存在图片,则更新图片的属性uploadedImage.setAttribute('src', code);uploadedImage.setAttribute('alt', '');uploadedImage.setAttribute('width', '79');uploadedImage.setAttribute('height', '79');} else {// 如果不存在图片,则创建新的图片元素并添加到容器中uploadedImage = document.createElement('img');uploadedImage.setAttribute('id', 'uploaded-image');uploadedImage.setAttribute('src', code);uploadedImage.setAttribute('alt', '');uploadedImage.setAttribute('width', '79');uploadedImage.setAttribute('height', '79');imageContainer.appendChild(uploadedImage);}console.log(imageContainer);},error: function(res){}});}$("#image-preview").on('click', 'img',function(event) {let _this = $(this);//将当前的pimg元素作为_this传入函数imgShow("#outerDiv", "#innerDiv", "#bigImg", _this);});function imgShow(outerDiv, innerDiv, bigImg, _this){let src = _this.attr("src");//获取当前点击的pimg元素中的src属性$(bigImg).attr("src", src);//设置#bigimg元素的src属性$("<img/>").attr("src", src).on("load", function() {let windowW = $(window).width();//获取当前窗口宽度let windowH = $(window).height();//获取当前窗口高度let realWidth = this.width;//获取图片真实宽度let realHeight = this.height;//获取图片真实高度let imgWidth, imgHeight;let scale = 0.8;//缩放尺寸,当图片真实宽度和高度大于窗口宽度和高度时进行缩放if(realHeight>windowH*scale) {//判断图片高度imgHeight = windowH*scale;//如大于窗口高度,图片高度进行缩放imgWidth = imgHeight/realHeight*realWidth;//等比例缩放宽度if(imgWidth>windowW*scale) {//如宽度扔大于窗口宽度imgWidth = windowW*scale;//再对宽度进行缩放}} else if(realWidth>windowW*scale) {//如图片高度合适,判断图片宽度imgWidth = windowW*scale;//如大于窗口宽度,图片宽度进行缩放imgHeight = imgWidth/realWidth*realHeight;//等比例缩放高度} else {//如果图片真实高度和宽度都符合要求,高宽不变imgWidth = realWidth;imgHeight = realHeight;}$(bigImg).css("width",imgWidth);//以最终的宽度对图片缩放var w = (windowW-imgWidth)/2;//计算图片与窗口左边距var h = (windowH-imgHeight)/2;//计算图片与窗口上边距$(innerDiv).css({"top":h, "left":w});//设置#innerdiv的top和left属性$(outerDiv).fadeIn("fast");//淡入显示#outerdiv及.pimg}).on("error", function() {// Error loading image});$(outerDiv).click(function(){//再次点击淡出消失弹出层$(this).fadeOut("fast");});}
</script>
</html>

四、Servlet完整代码

package com.example.javaweb;import com.alibaba.fastjson.JSONObject;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import java.io.*;
import java.util.List;
import java.util.UUID;
import javax.servlet.http.*;
import javax.servlet.annotation.*;@WebServlet(name = "upload", value = "/upload")
public class UploadServlet extends HttpServlet {private final int MAX_FILE_SIZE = 1024 * 1024 * 10;private final int MAX_MEN_SIZE = 1024 * 1024 * 10;@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) {try {upload(request,response);}catch (Exception e){throw new RuntimeException(e);}}public void upload(HttpServletRequest request, HttpServletResponse response) throws Exception {//设置对客户端请求进行重新编码为UTF-8,否则会出现乱码request.setCharacterEncoding("UTF-8");//指定对服务器响应进行重新编码为UFT-8,同时浏览器也是根据这个参数来就行重写编码(又称解码)response.setCharacterEncoding("UTF-8");response.setContentType("text/json;charset=utf-8");// 检查是否有一个文件上传请求boolean isMultipart = ServletFileUpload.isMultipartContent(request);String savePath = "D:\\jsp\\";if (!isMultipart) {throw new Exception("非文件类型请求");}DiskFileItemFactory factory = new DiskFileItemFactory();// 文件大小的最大值将被存储在内存中factory.setSizeThreshold(MAX_MEN_SIZE);// 获取项目根目录绝对路径String path = getServletContext().getRealPath("");// 设置缓存文件的临时存放目录factory.setRepository(new File(path + "upload"));ServletFileUpload upload = new ServletFileUpload(factory);// 允许上传的文件大小的最大值upload.setSizeMax(MAX_FILE_SIZE);// 解析请求,获取文件项List<FileItem> fileItems = upload.parseRequest(request);// 处理上传的文件项for (FileItem fileItem : fileItems) {if (fileItem.isFormField()) {System.out.println(fileItem.getFieldName() + " - " + fileItem.getString("UTF-8"));}else {String fileName = UUID.randomUUID() +getFileType(fileItem.getName());String fullPath = savePath+fileName;mkdir(fullPath);// 写入文件File file = new File(fullPath);fileItem.write(file);}}JSONObject jsonObject = new JSONObject();jsonObject.put("code",200);jsonObject.put("msg","上传成功");response.getWriter().write(jsonObject.toString());}/*** 获取文件后缀* @param fileName* @return*/public String getFileType(String fileName){int lastIndex = fileName.lastIndexOf(".");String fileType = "."+fileName.substring(lastIndex+1);return fileType;}/*** 创建目录* @param path* @throws IOException*/public void mkdir(String path) throws IOException {File tempFile = new File(path);if(!tempFile.getParentFile().exists()){tempFile.getParentFile().mkdirs();//创建父级文件路径tempFile.createNewFile();//创建文件}}}

五、Gitee源码

Jsp+Servlet实现图片上传和点击放大预览功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/692259.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMamba模型

VMamba模型 摘要Abstract1. VMamba模型1.1 文献摘要1.2 研究背景1.3 状态空间模型&#xff08;SSM&#xff09;1.4 VMamba架构1.5 实验1.5.1 ImageNet-1K 上的图像分类1.5.2 COCO 上的物体检测 总结2. pytorch练习 摘要 Abstract 1. VMamba模型 文献出处&#xff1a;VMamba:…

Idea入门:一分钟创建一个Java工程

一&#xff0c;新建一个Java工程 1&#xff0c;启动Idea后&#xff0c;选择 [New Project] 2&#xff0c;完善工程信息 填写工程名称&#xff0c;根据实际用途取有意义的英文名称选择Java语言&#xff0c;可以看到还支持Kotlin、Javascript等语言选择包管理和项目构建工具Mav…

03.Linux文件操作

1.操作系统与Linux io框架 1.1 io与操作系统 1.1.1 io概念 io 描述的是硬件设备之间的数据交互&#xff0c;分为输⼊ (input) 与输出 (output)。 输⼊&#xff1a;应⽤程序从其他设备获取数据 (read) 暂存到内存设备中&#xff1b;输出&#xff1a;应⽤程序将内存暂存的数据…

@PostConstruct

PostConstruct initializeBean方法–> PostProcessor.postProcessMergedBeanDefinition --> InitDestroyAnnotationBeanPostProcessor.postProcessBeforeDestruction 被PostConstruct注解的方法会在Bean初始化的时候被调用&#xff0c;如下图&#xff1a; 继承关系如下…

03c++继承与多态

目录&#xff1a; 继承的本质和原理派生类的构造过程重载覆盖 隐藏静态绑定和动态绑定多态 vfptr和vftable抽象类的设计原理多重继承以及问题虚基类 vbptr和vbtableRTTIc四种类强转继承多态常见笔试面试题目分享 1、继承的本质和原理&#xff1a; 继承方式&#xff1a; 基类…

基于SSM的计算机课程实验管理系统的设计与实现(源码)

| 博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f44…

MFC通过继承现有控件自定义控件

在MFC 自定义控件&#xff0c;可以通过继承MFC提供的控件类&#xff08;如CButton、CEdit、CListBox等&#xff09;并重写其成员函数和消息处理函数来实现。 以下是一个基本的步骤指南&#xff0c;用于在MFC中创建自定义控件&#xff1a; 确定要继承的基类&#xff1a; 首先…

四十九坊股权设计,白酒新零售分红制度,新零售策划机构

肆拾玖坊商业模式 | 白酒新零售体系 | 新零售系统开发 坐标&#xff1a;厦门&#xff0c;我是易创客肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 不花钱开3000多家门店&#xff0c;只靠49个男人用一套方法卖白酒…

CentOS操作

1.如何修改主机名 方法一&#xff1a; 修改命令&#xff1a;hostnamectl set-hostname 主机名 查看命令&#xff1a;hostname 方法二和方法三都是永久改变主机名&#xff0c;需要密码验证 方法二 修改命令&#xff1a;nmcli general hostname 主机名 查看命令&#xff…

Linux day4 _vim及其相关指令

wc命令 做数量统计 可以通过wc命令统计文件的行数&#xff0c;单词数量等 语法&#xff1a;wc [-c -m -l -w] 文件路径 选项 -c&#xff0c;统计bytes数量 -m&#xff0c;统计字符数量 -l&#xff0c;统计行数 -w统计单词数量 参数&#xff0c;文件路径&#xff0c;被统…

VMware Workstation 16 Pro安装教程

文章目录 1、下载2、安装 1、下载 复制到迅雷下载&#xff1a;https://download3.vmware.com/software/wkst/file/VMware-workstation-full-16.0.0-16894299.exe 2、安装 秘钥&#xff1a; ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2UT6 ZF71R-DMX85-08DQY-…

Django国际化与本地化指南

title: Django国际化与本地化指南 date: 2024/5/12 16:51:04 updated: 2024/5/12 16:51:04 categories: 后端开发 tags: Django-i18n本地化-L10n多语言国际化翻译工具表单验证性能优化 引言 在数字化时代&#xff0c;网站和应用程序必须跨越地域限制&#xff0c;服务于全球…