表单和servlet在idea中实现文件的上传

news2024/9/23 7:24:50

1.前端jsp的搭建。

通过type=file的input标签就可以选择要上传的文件,当submit提交表单的时候就可以将选定的文件以流的形式提交。要注意的技术细节就是表单中有上传文件功能时,必须显式的将表单enctype设置为multipart/form-data,不带文件上传的表单(例如只是提交各种name/value的表单)使用的默认enctype是application/x-www-form-urlencoded。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<form enctype="multipart/form-data" action="fileupload" method="post">
        <input type="file" name="file" >
        <input type="submit" value="上传文件">
</form>
<img src="${param.img}">

 此时的jsp界面如图所示:

  选择文件后,点击上传文件按钮,会将文件相关内容以post的方式提交给/fileupload。

2.Servlet的编写。

文件的上传和保存到服务器本质上就是一次IO操作。服务器通过InputStream读取上传的内容,通过FileOutputStream将读取的内容保存到文件。要注意的技术细节有:

引入commons-fileupload 1.4和commons-io 2.11,将上传的文件包装成了FileItem类型,简化了相关的操作。

保存文件的路径设定。

我们所有的资源访问路径(例如jsp,js,image等)其实都是按照项目的开发路径展开的,也就是项目开发路径中webapp的目录结构。

例如有这样的项目结构:

如果在index.jsp中显示img_1.jpeg,那index.jsp中img标签的src属性值可以使用一个相对路径:/images/img_1.jpeg

项目部署的时候,会将项目内容从开发路径复制到部署路径。复制的时候根据TOMCAT的设定,一种是将项目打包成.war文件,将.war文件复制到部署路径下,这种方式称为archive;另一种方式就是直接带着目录结构的复制,这种方式称为exploded。

但是,我们使用maven的webapp骨架构建的项目时,会多一层设置。项目部署时会先将项目结构复制到一个target子文件中,然后再根据target文件夹下的目录结构复制导数TOMCAT部署路径中。这就会有一个问题,项目部署后上传的文件只会保存到target下的项目结构中,没有办法影响到原项目。而且项目重新部署时,target子文件夹下的内容会被全部覆盖。

所以正确的设置是将项目output directory直接就写成源项目webapp所在位置即可。

正确的设置方式是:首先在IDEA中新建一个保存上传内容的文件夹,例如uploadfiles。

然后进入File菜单下的project structure,修改exploded的output directory,路径中就是真正的项目源文件路径,不包含任何target内容。

 最后进入TOMCAT的配置,确认一下deployment 的是exploded而不是war。

 至此相关设定结束,可以开始编写处理上传文件保存的servlet了

package servlets;


@WebServlet(value = "/fileupload")
public class FileuploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            //将上传内容封装为FileItem
            List<FileItem> fileItems = upload.parseRequest(request);
            for (FileItem item:fileItems) {
                //上传文件的inputstream
                InputStream inputStream = item.getInputStream();
                //上传文件本身的名字
                String fileName = item.getName();
                //获取新建的uploadfiles文件夹的实际路径
                //根据之前的设定,这个路径是: 项目文件夹/src/main/webapp/uploadfiles
                String path = getServletContext().getRealPath("\\uploadfiles");
                System.out.println("服务器保存文件路径是: "+path+"\\"+fileName);
                //利用FileOutputStream将内容保存到服务器上
                FileOutputStream outputStream = new FileOutputStream(new File(path+"\\"+fileName));
                byte[] bytes = new byte[1024];
                int count=0;
                while ((count=inputStream.read(bytes))!=-1){
                    outputStream.write(bytes,0,count);
                }
                inputStream.close();
                outputStream.close();
                //重定向到jsp文件,并将刚刚上传文件的路径作为img参数的值
                response.sendRedirect("insertuserinfo.jsp?img=/uploadfiles/"+fileName);
            }
        } catch (FileUploadException e) {
            throw new RuntimeException(e);
        }
    }
}

运行TOMCAT部署项目:

 上传文件的名称是df65b...934f8cdc.jpeg,点击上传文件后:

 再看一下项目结构和控制台输出:

 

---------------------------------------------------------------------------------------------------------------------------------最后一点,IDEA中编写的Web项目在部署到TOMCAT的时候,是不会将项目放到我们安装或配置的正经TOMCAT的webapps下的(尽管复制到TOMCAT webapps下应该才是主流的做法)。

IDEA根据自身版本的不同,会把Web项目部署到C:\users\用户名\.IntelliJIdea2021.2下面的system\tomcat文件夹,或者C:\Users\pigli\AppData\Local\JetBrains\IntelliJIdea2022.2下面的tomcat文件夹下。每个编码文件夹对应一个项目:

 这个文件夹就是这就是副本Tomcat目录。点进去一个其实可以看出和原生的目录大体一致,但是缺少了bin目录、lib目录、temp目录。

 

虽然这是副本目录,但是运行是依靠原生的Tomcat去运行(这里的意思就是 idea在运行项目的时候启动的依旧是原生Tomcat),原生TOMCAT会通过一些环境变量的设置去访问副本的Tomcat。所以就不用把这些项目内容复制到原生TOMCAT的webapps文件夹下了。

继续点击项目文件夹下conf\Catalina\localhost\ROOT.xml,docBase属性就是一个项目的output directory设定:

这是经过修改,output directory直接是项目目录结构。上传文件时,会直接将文件保存到原项目webapp下的目录结构中,通过相对路径访问也是没有问题。

<Context path="" docBase="D:\JavaProjects\servlettest\src\main\webapp" />

下面的docBase是利用maven webapp骨架创建的web_mod模块的output directory。

<Context path="" docBase="D:\JavaProjects\mytestempty\web_mod\target\web_mod.war" />

如果在web_mod中进行相关的文件上传,可能就会出现路径问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决gif导出后显示异常的现象

解决gif导出后显示异常的现象 背景&#xff1a; 上次gif支持透明度后&#xff0c;https://blog.csdn.net/c553110519/article/details/127757148?spm1001.2014.3001.5501&#xff0c; 发现当输入是动态的时候&#xff0c;会出现异常现象 如下所示&#xff1a; 现象原因分析…

[附源码]Python计算机毕业设计Django校园招聘微信小程序

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

原理说明书艾美捷魔力红组织蛋白酶B活性分析试剂盒

艾美捷ICT魔力红组织蛋白酶B活性分析试剂盒被研究人员用来定量和监测培养细胞和组织中的组织蛋白酶活性。 Quantitate and monitor intracellular cathepsin-B activity over time in vitro. The Magic Red substrate in this assay fluoresces red upon cleavage by active ca…

torch.nn.functional

非线性激活函数 torch.nn.functional.threshold(input, threshold, value, inplaceFalse)torch.nn.functional.relu(input, inplaceFalse)torch.nn.functional.relu6(input, inplaceFalse)torch.nn.functional.elu(input, alpha1.0, inplaceFalse) torch.nn.functional.leaky_…

智云通CRM:如何使用万能的“三问”,提升业绩?

我们在销售产品时&#xff0c;客户往往不知道自己需要什么。如果在这样的情况下贸然推销产品&#xff0c;很容易遭到客户的厌烦。 因此&#xff0c;销售要做的就是尽可能地帮助客户整理头绪&#xff0c;激发他们的购买欲。要做到这一点&#xff0c;只需要三句话&#xff1a; …

led护眼灯有蓝光吗?双十二选led护眼灯的好处有哪些

现在的人造灯光&#xff0c;任何产品都不可能完全避免蓝光&#xff0c;市面上宣传的所谓完全无蓝光其实就是虚假宣传&#xff0c;一个是技术上几乎做不到完全无蓝光&#xff0c;另一个就是这也完全没必要&#xff0c;因为要达到比较好的光线显色效果&#xff0c;就必须要保证全…

Elasticsearch的高级查询

目录 一、条件查询 1、单条件 1&#xff09;路由查询 2&#xff09;body体查询 2、多条件查询 1&#xff09;and---must 2&#xff09;or---should 3&#xff09;范围---filter 3、全文检索、完全匹配、高亮显示 二、聚合查询 1、分组 2、求平均值 一、条件查询 1、单…

通过虚拟机搭建个人NAS

通过虚拟机搭建个人NAS 1 搭建黑群辉NAS 前期资料&#xff1a; 黑群晖系统 天翼云&#xff1a;https://cloud.189.cn/t/Vj2QRbFzq6Nn&#xff08;访问码&#xff1a;i94s&#xff09; 百度网盘&#xff1a;链接:https://pan.baidu.com/s/1MqimGhZnOTIcYfZhY5Z4lw 提取码:75n…

JSP 视频点播系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 视频点播系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开 发&#xff0c;数据库为Mysql&#xff0c;使用ja…

【数据集NO.5】小目标检测数据集汇总

文章目录前言一、TinyPerson数据集二、密集行人检测数据集三、加州理工学院行人检测数据集前言 数据集对应应用场景&#xff0c;不同的应用场景有不同的检测难点以及对应改进方法&#xff0c;本系列整理汇总领域内的数据集&#xff0c;方便大家下载数据集&#xff0c;若无法下…

大数据-Hadoop部署模式

一、JDK安装与配置 1、下载JDK压缩包 2、上传到master虚拟机 将JDK压缩包上传到master虚拟机/opt目录 查看上传的JDK压缩包 3、在master虚拟机上安装配置JDK 执行命令&#xff1a;tar -zxvf jdk-8u231-linux-x64.tar.gz -C /usr/local&#xff0c;将JDK压缩包解压到指定目…

【VUE3】保姆级基础讲解(一):初体验与指令

目录 安装和引入 CDN 本地引入 VUE初体验 MVVM模型 data属性 与 methods属性 VUE基础-模板语法 Mustache双大括号语法 v-once指令 v-html v-pre v-cloak v-memo v-bind&#xff08;重要&#xff09; 对象语法 v-bind直接绑定对象 v-on 条件渲染 v-for 基础使…

antd级联选择器(a-cascader)动态加载和动态回显效果实现

文章目录1、介绍2、效果图如下图所示&#xff1a;&#xff08;只实现3层的&#xff09;3、实现方法&#xff08;1&#xff09;层级可单独选择&#xff08;2&#xff09;组件使用&#xff08;3&#xff09;data数据&#xff08;4&#xff09;实现动态加载数据1、 提示&#xff1…

模糊预测|RFIS与ANFIS模糊模型预测的比较(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

vue2中实现右键菜单

vue2中实现右键菜单 效果图-右键菜单 1、安装 npm install vue-contextmenujsyarn add vue-contextmenujsCDN <script src"https://unpkg.com/vue-contextmenujs/dist/contextmenu.umd.js">2、使用 2.1、引入 src/main.js import Contextmenu from "…

python sklearn knn快速实现,保姆级教学

目录介绍KNN实战加载模块读取数据训练、测试数据分割关键环节&#xff1a;训练预测sklearn官方代码实例介绍 首先上链接 https://www.sklearncn.cn/ scikit-learn是基于Python语言的机器学习库&#xff0c;具有&#xff1a; 简单高效的数据分析工具 可在多种环境中重复使用 …

一套Altair Feko复杂结构模型散射和天线辐射仿真建模攻略

导读&#xff1a;Feko软件广泛应用于电磁散射、电磁辐射仿真&#xff0c;例如&#xff1a;天线、天线布局、天线罩、屏蔽效能、电磁散射、频选结构、线束EMC等方面。问题种类繁多&#xff0c;但是无论仿真哪一类问题&#xff0c;其仿真流程是相同的&#xff0c;我们只需掌握了这…

VirtualBox Ubuntu 16.04 磁盘不相邻分区扩容解决方案

前言 博主做期末大作业时用到 VirtualBox 6.1 安装的 Ubuntu 16.04 LTS 虚拟机&#xff0c;开始只分配了 20GB 硬盘&#xff0c;跑实验时发现空间不够&#xff0c;需要对磁盘扩容&#xff0c;折腾了半天&#xff0c;在此做一个小记录。 警告&#xff1a;博主并不精通 Linux&am…

风险评估具体操作流程

概述 风险评估应贯穿于评估对象生命周期 各阶段中。评估对象生命周期各阶段中涉及的风险评估原则和方法昆一致的&#xff0c;但由干各阶段实施内容对象、安全需求不同.使得风险评估的对象、目的、要求等各方面也有所不同。在规划设计阶段&#xff0c;通过风险评估以确定评估对…

摄影师接单小程序开发,自由交易平台

在网红直播经济的强势发展下&#xff0c;年轻一代对于摄影方面的需求急速增长&#xff0c;但是年轻人群体在摄影方面的要求更趋向于个性化&#xff0c;普通的影楼不仅拍摄价格高&#xff0c;在拍摄风格上也比较单调&#xff0c;缺乏创新&#xff0c;难以满足用户消费需求。对于…