web后端Servlet实现文件上传(最后用于图书类)

老规矩哦,别抄哦兄弟们!不包含基本的ajax基本封装哦,要是有需要,可以私信找我,我发给你,你放在包里面,二次直接调用。

前端html代码:(在这个js中实现了点击选择文件后,再跳出一个input=‘file’)<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件上传</title><script src="js/jquery-3.2.1.min.js"></script></head><body><form id="formId" method="post" enctype="multipart/form-data" action="Upload"><label for="studentId">学号:</label><input type="text" id="studentId" name="studentId"><br><br><label for="studentName">姓名:</label><input type="text" id="studentName" name="studentName"><br><br>爱好:<input type="checkbox" checked="checked" name="fav" value="小说"/>小说<input type="checkbox" name="fav" value="游戏"/>游戏<input type="checkbox" name="fav" value="打架"/>打架<input type="checkbox" name="fav" value="旅游" />旅游 <br><br><label for="fileInput">照片:</label><input type="file" id="fileInput" name="fileInput" onchange="addFileInput()"><br><br><div id="fileInputsContainer"></div><br><input type="button" value="提交" onclick="mySubmit()"></form><script>function mySubmit() {// 其它验证操作alert("已经点击提交马上进入js封装部分");var formId = document.getElementById('formId');mySelfAjaxSubmit(formId);}function mySelfAjaxSubmit(form) {var url = form.action;var method = form.method;var formData = new FormData(form);//alert(url + "|" + method + "|" + formData.toString());$.ajax({type: method,url: url,data: formData,processData: false, // 不要处理数据contentType: false, // 不设置内容类型-----------------此处为JS的ajax封装success: function (re) {alert("提交成功");// 这里可以根据返回的数据执行其他操作},error: function () {alert("提交失败");}});}function addFileInput() {-----------------此处为JS的弹出选择框var fileInput = document.createElement('input');fileInput.type = 'file';fileInput.name = 'fileInput';fileInput.onchange = addFileInput;document.getElementById('fileInputsContainer').appendChild(fileInput);}</script></body></html>

在html中的要求实现截图:(核心代码已经用红色标注)

弹出的截图:

<---------------------------------------------------------------------------------------------------------------------->

Servlet代码:我已经进行了基本的封装

这是核心代码

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub//doGet(request, response);ToolInsert op = new ToolInsert();op.setUTF_8(request, response);UpFileToServer up = new UpFileToServer();up.upToFile(request, response);}//dopost的括号

封装的文件夹:

其中,ToolInsert.java是之前封装的工具类,包含了设置utf-8;

UpFileToServer.java代码如下:

package JSONObject;import java.io.File;import java.io.IOException;import java.util.Collection;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;import com.alibaba.fastjson.JSONObject;public class UpFileToServer {public UpFileToServer() {}public void upToFile(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("进入后端检测:进入后端");String savaPathString = "C:\\Uploadfile";Collection<Part> parts = request.getParts();//集合JSONObject jsonObject = new JSONObject();//json存储空间//第一次判断类型for(Part part0 :parts) {System.out.println(part0.getContentType());}for(Part part0 :parts) {if(part0.getContentType() == null) {//普通textString keyName = part0.getName();//去part名String[] keyValue = request.getParameterValues(keyName);//通过part名取值分割数据(对应多文件)System.out.println("普通非文件处理进入:");//单一文件,存在part{0}中if(jsonObject.getString(keyName) == null){//加代码part并且有一个检验jsonObject.put(keyName , keyValue[0]);}else {jsonObject.put(keyName, jsonObject.getString(keyName)+"|");Integer splitNum = (jsonObject.getString(keyName).split("\\|")).length;jsonObject.put(keyName,jsonObject.getString(keyName)+keyValue[splitNum]);}}else {//文件操作System.out.println("文件处理进入:");//存在该键名,提交表单取名,从请求头中描述数据String header = part0.getHeader("Content-Dispositon");String fileNameString = part0.getSubmittedFileName();System.out.println("getHeader:" +header);System.out.println(fileNameString);//到这里是查看文件头部信息和详情,下一步对文件名加上时间戳,准备保存if (part0.getSubmittedFileName() != null) {// 获取当前时间戳long timestamp = System.currentTimeMillis();String fileName= part0.getSubmittedFileName();// 构建新的文件名(时间戳 + 原文件名),并对文件名进行处理String newFileName = timestamp + "_" + fileName.replaceAll("[^a-zA-Z0-9.-]", "_");// 准备保存文件的路径String savePathString = savaPathString + File.separator + newFileName;File saveFile = new File(savePathString);try {// 将上传的文件保存到指定路径part0.write(saveFile.getAbsolutePath());System.out.println("文件保存成功");// 文件名注入jsonString keyName = part0.getName(); // 获取part名// 将新文件名存入JSON对象jsonObject.put(keyName, newFileName);System.out.println("注入json操作完成");} catch (IOException e) {System.out.println("文件保存失败:" + e.getMessage());e.printStackTrace();}}System.out.println(jsonObject.toJSONString());}}}}

注意/不足:

我将这些代码基本封装在upToFile(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException函数中,更想通用的话,需要将里面的JSONObject类和collection类作为参数传进去,然后再把保存文件的savaPath作为一个String参数传进去,然后就可以变成万能的上传文件到服务器的模板了,但是由于时间的关系,我没有写出mysql的增删改查语句来导入mysql,理论上时间多一些的话,完全是可以手敲代码不借用工具的情况下把mysql语句直接插入到数据库中,因为平常我们使用的是可视化Navicat来进行数据库操作,再把jdbc的url等基本参数封装在formToSql文件工具夹里面,实现一整套前后端交互行为,我在后面会附上完整的Upload的代码。

遇到一些困难

1.数据注入json的判断,课堂上我们通过取Part然后将前端传入的数据到后端,存在part中,然后遍历,再取出key/value值,但是在我手写的过程中,课堂上用到的subString函数总是存在json的报错,说是指针指向空。

2.文件的保存,我感觉我们的变量,课堂上的时候距离设置得太远了,有时候会定义不同的参数来表达同一个值

下面是运行成功的截图:

正片:------------------------------------------------------------------------

现在我把这个代码移交到我的book类中:

1.由于原来的book使用的enctype是简单文件的格式,要换为

multipart/form-data”才可以

2.在原来book的html中需要增加注解:

@MultipartConfig ”在BookReg中

  1. 复制JSONObject包到Book项目的java中
  2. 完成代码植入

运行截图如下:

Null为检测到的为普通文件,下面的是在封装的函数中进行的一个处理,一个循环导出的,后面项目完成后注释;

经过更改book的html,把测试中的文件选择加入到book的html中:(附二展示代码)

提交之后的截图:

在服务器端的文件查看:

附:

import java.io.File;import java.io.IOException;import java.util.Collection;import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;import com.alibaba.fastjson.JSONObject;import JSONObject.UpFileToServer;import formToSQL.ToolInsert;/*** Servlet implementation class Upload*/@WebServlet("/Upload")@MultipartConfigpublic class Upload extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public Upload() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubresponse.getWriter().append("Served at: ").append(request.getContextPath());}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub//doGet(request, response);ToolInsert op = new ToolInsert();op.setUTF_8(request, response);UpFileToServer up = new UpFileToServer();up.upToFile(request, response);}//dopost的括号}//最大的括号

附二:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Book.html</title><style>table {width: 60%;margin: 0px auto; /* 让表格水平居中 */border-collapse: collapse;line-height: 35px;}th, td {/* border: 1px solid black; */padding: 8px;text-align: left; /* 内容居中 */}#topic{text-align: center;font-size: 35px;}#change_web_color{font-size: 20px;}.sub{margin: 65% 50% ;}</style><script src="JS/book.js"></script><script src="JS/jquery-3.2.1.min.js"></script><script>function addFileInput() {var fileInput = document.createElement('input');fileInput.type = 'file';fileInput.name = 'fileInput';fileInput.onchange = addFileInput;document.getElementById('fileInputsContainer').appendChild(fileInput);}</script></head><body><div><form action="BookReg" name="bookForm" id="bookForm1" method="post" enctype="multipart/form-data"><h2 id="topic">图书入库</h2><div><button id="change_web_color">改变网页颜色</button></div><table><tr><td>ISBN:</td><td><input type="text" name="ISBN" id="ISBN" required> *必填</td></tr><tr><td>图书名:</td><td><input type="text" name="bookName" id="bookName" required> *必填</td> </tr><tr><td>作者:</td><td><input type="text" name="writer" id="writer"></td> </tr><tr><td>类别:</td><td><select name="type" id="type"><option value="理工科">理工科</option><option value="文科">文科</option></select></td></tr><tr><td>是否贷款:</td><td><label for=""><input type="radio" name="loan" id="loan_Y">是</label><label for=""><input type="radio" name="loan" id="loan_N">否</label></td></tr><tr><td>出版社:</td><td><input type="text" name="press" id="press"></td> </tr><tr><td>出版日期:</td><td><input type="date" name="brith" id="brith"></td></tr><tr><td>版次:</td><td><input type="text" name="edNum" id="edNum"><input type="range" id="range" name="range"></td> </tr><tr><td>单价:</td><td><input type="text" name="money" id="money">元</td></tr><tr><td>文件选择:</td><td><input type="file" id="fileInput" name="fileInput" onchange="addFileInput()"></td> <td> <div id="fileInputsContainer"></div></td> </tr><tr><td> <div id="fileInputsContainer"></div></td> </tr><tr><td>图书介绍:</td><td><textarea name="introduction" id="introduction" cols="30" rows="10"></textarea></td> </tr><tr><td class="sub" id="submitBtn" onclick="check()"><button>提交</button></td><td class="sub"><button>取消</button></td></tr></table></form></div></body></html>

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

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

相关文章

服务器被挖矿了怎么办,实战清退

当我们发现服务器资源大量被占用的时候&#xff0c;疑似中招了怎么办 第一时间重启服务是不行的&#xff0c;这些挖矿木马一定是会伴随着你的重启而自动重启&#xff0c;一定时间内重新霸占你的服务器资源 第一步检查高占用进程 top -c ps -ef 要注意这里%CPU&#xff0c;如果…

Day75:WEB攻防-验证码安全篇接口滥用识别插件复用绕过宏命令填入滑块类

目录 图片验证码-识别插件-登录爆破&接口枚举 登录爆破 接口枚举 图片验证码-重复使用-某APP短信接口滥用 滑块验证码-宏命令-某Token&Sign&滑块案例 知识点&#xff1a; 1、验证码简单机制-验证码过于简单可爆破 2、验证码重复使用-验证码验证机制可绕过 3、…

使用ChatGPT的场景之gpt写研究报告,如何ChatGPT写研究报告

推荐写研究报告使用智能站&#xff1a; dayfire.cn/ 1. 确定研究主题 明确主题&#xff1a;在开始之前&#xff0c;你需要有一个清晰的研究主题。这将帮助AI更好地理解你的需求…

【网络爬虫】(1) 网络请求,urllib库介绍

各位同学好&#xff0c;今天开始和各位分享一下python网络爬虫技巧&#xff0c;从基本的函数开始&#xff0c;到项目实战。那我们开始吧。 1. 基本概念 这里简单介绍一下后续学习中需要掌握的概念。 &#xff08;1&#xff09;http 和 https 协议。http是超文本传输&#xf…

STM32之HAL开发——Keil调试工具介绍

Debug介绍 在Keil工具中有许多常用的小工具&#xff0c;下面将会依次为大家介绍每个工具的用途。 命令行窗口 在窗口内可以输入一些指令&#xff0c;来进行断点设置以及删除&#xff0c;一般不常用 反汇编窗口 可以查看当前C代码的汇编指令 标志窗口 寄存器窗口 可以用来查看C…

Knative 助力 XTransfer 加速应用云原生 Serverless 化

作者&#xff1a;元毅 公司介绍 XTransfer 是一站式外贸企业跨境金融和风控服务公司&#xff0c;致力于帮助中小微企业大幅降低全球展业的门槛和成本&#xff0c;提升全球竞争力。公司连续7年专注 B2B 外贸金融服务&#xff0c;已成为中国 B2B 外贸金融第一平台&#xff0c;目…

FFmpeg+mediamtx 实现将本地摄像头推送成RTSP流

文章目录 概要推流过程实现过程安装FFmpeg安装Mediamtx 启动推流 概要 FFmpegmediamtx实现将本地摄像头推送成RTSP流 FFmpeg 版本号为&#xff1a;N-114298-g97d2990ea6-20240321 mediamtx 版本号为&#xff1a;v1.6.0 推流过程 摄像头数据&#xff0c;经过ffmpeg的推流代码…

华为OD机22道试题

华为OD机试题 2.查找小朋友的好朋友位置 在学校中&#xff0c;N 个小朋友站成一队&#xff0c;第 i 个小朋友的身高为 height[i]&#xff0c;第 i 个小朋友可以看到第一个比自己身高更高的小朋友j&#xff0c;那么 j 是 i 的好朋友 (要求&#xff1a;j>i) 。 请重新生成一个…

图解Kafka架构学习笔记(二)

kafka的存储机制 https://segmentfault.com/a/1190000021824942 https://www.lin2j.tech/md/middleware/kafka/Kafka%E7%B3%BB%E5%88%97%E4%B8%83%E5%AD%98%E5%82%A8%E6%9C%BA%E5%88%B6.html https://tech.meituan.com/2015/01/13/kafka-fs-design-theory.html https://feiz…

服务端高并发分布式结构

前言 本文以⼀个 “电子商务” 应用为例&#xff0c;介绍从⼀百个到千万级并发情况下服务端的架构的演进过程&#xff0c;同时列举出每个演进阶段会遇到的相关技术&#xff0c;让大家对架构的演进有⼀个整体的认知&#xff0c;方便⼤家对后续知识做深⼊学习时有⼀定的整体视野…

iOS-UIFont 实现三方字体的下载和使用

UIFont 系列传送门 第一弹加载本地字体:iOS UIFont-新增第三方字体 第二弹加载线上字体:iOS-UIFont 实现三方字体的下载和使用 前言 在上一章我们完成啦如何加载使用本地的字体。如果我们有很多的字体可供用户选择,我们当然可以全部使用本地字体加载方式,可是这样就增加了…

RSTP环路避免实验(华为)

思科设备参考&#xff1a;RSTP环路避免实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 RSTP (Rapid Spanning Tree Protocol) 是从STP发展而来 • RSTP标准版本为IEEE802.1w • RSTP具备STP的所有功能&#xff0c;可以兼容STP运行 • RSTP和STP有所不同 减少了…

基于Arduino IDE 野火ESP8266模块 EEPROM 存储开发

一、操作存储器 我们可以使用ESP8266模块的EEPROM&#xff0c;也就是可读可擦存储器&#xff0c;可以掉电不丢失地帮我们存储一些数据。ESP8266微控制器有一个闪存区(Flash memory) 来模拟Arduino的EEPROM。这是微控制器中一个特殊的内存位置&#xff0c;即使在主板关闭后&…

Selenium 自动化 —— 浏览器窗口操作

更多内容请关注我的专栏&#xff1a; 入门和 Hello World 实例使用WebDriverManager自动下载驱动Selenium IDE录制、回放、导出Java源码 当用 Selenium 打开浏览器后&#xff0c;我们就可以通过 Selenium 对浏览器做各种操作&#xff0c;就像我们日常用鼠标和键盘操作浏览器一…

基于nodejs+vue企业人才引进服务平台python-flask-django-php

本文通过采用MySQL数据库以及nodejs语言、express框架&#xff0c;结合国内线上管理现状&#xff0c;开发了一个基于node的企业人才引进服务平台。系统分为多个功能模块&#xff1a;用户信息、企业信息、招聘信息、应聘信息等。通过系统测试&#xff0c;本系统实现了系统设计目…

pe启动盘破解windows密码wins电脑登录密码修改重置

目录 1.进入电脑BIOS&#xff0c;设置电脑第一启动项为U盘启动2.进入微pe系统3.然后点击界面最左下方的Windows图标4.点击windows密码选择对应用户名称修改&#xff1b; 1.进入电脑BIOS&#xff0c;设置电脑第一启动项为U盘启动 把u盘插到要清除密码的电脑&#xff0c;然后开机…

测试环境搭建整套大数据系统(十二:挂载磁盘到hadoop环境)

一&#xff1a;链接硬盘 将硬盘连接到计算机的 SATA 接口或 USB 接口&#xff0c;并确保硬盘通电并处于可用状态。 二&#xff1a;查看硬盘信息 sudo fdisk -l三&#xff1a;创建分区 gdisk /dev/vbd重新扫描磁盘 partprobe /dev/vdb格式化磁盘 mkfs.ext4 /dev/vdb2查看磁…

【vscode打开多文件夹】

1)将文件夹添加到工作空间中 2)文件夹方式展开 3)最终效果 小技巧&#xff1a; 文件夹的位置不对的话&#xff0c;可以拖动进行调整。

原生 HTML/CSS/JS 实现右键菜单和二级菜单

文章来源&#xff1a;www.huhailong.vip 站点 文章源地址&#xff1a;https://www.huhailong.vip/article/1764653112011841538 Demo效果演示地址 先看效果图 {{{width“auto” height“auto”}}} 需要注意的就是边界检测处理&#xff0c;到极端点击底部和右侧时如果不做处理会…

四创科技解决方案

联合解决方案 推进智慧水利建设是推动新阶段水利高质量发展的六条实施路径之一,四创科技按照“需求牵引、应用至上、数字赋能、提升能代化能力”要求,以数字化、网络化、智能化为主线,以数字化场景、智慧化模拟、精准化决策为路径&#xff0c;以构建数字李生流域为核心,全面推进…