文件上传的实现

前端准备:


使用表单进行文件上传
1. form的method属性提交方式: post

2. form 的enctype属性:

enctype的默认值: application/x-www-form-urlencoded对表单数据进行url编码->对文本进行编码 

中:(UTF-8)占3个字节-> url编码:每一个字节变成: %两位十六进制

类似于这种形式:%17%AB%E7

multipart/form-data->多部件表单数据 针对文件

3.使用表单子元素:`<input type="file" />

后台准备:


 1.添加jar包 添加commons-fileupload.jar: commons-io.jar 到web-inf里面的lib

2.编写servlet来接收前端请求 前端有请求参数 现在还是用request.getParameter来接收吗?

如果我们的表单enctype设置为'multipart/form-data',此时request.getParamter()这一类方法都失效,获取不到请求参数

获取请求参数借助导入commos-fileUpload代码

commos-fileUpload编码的步骤:

1.创建解析器工程对象:DiskFileltemFactory ->直接new

DiskFileItemFactory factory = new DiskFileItemFactory()

2.根据Fileltem工厂对象得到解析器: ServletFileUpload

 ServletFileUpload fileUpload = new ServletFileUpload(factory)

3.使用解析器来解析request对象,得到Fileltem集合

List<FileItem> list = fileUpload .parseRequest( request)

Fileltem:表单项,就是前端form表单中表单子元素: input.selected,textarea等等

分类:文件域(type=file),非文件域(普通表单子元素)

遍历Fileltem集合,得到每一个Fileltem,判断是否是文件域还是非文件域,如果文件域进行文件上传,非文件域:得到value

文件上传1.改servelt代码upload.jsp -> test
<form action = "UploadServlet" method="post" enctype="multipart/form-data">头像:<input type="file" name = "photo">姓名:<input type="text" name="name"><br><input type="submit" value="上传" /> 提交表单submit reset重置 button普通按钮(需要绑定事件  )
</form>UploadServlet.java
doPost(){DiskFileItem factory = new DiskFileItemFactory();Servlet fileUpload = new ServletFileUpload(factory);try{List<FileItem> fileItem = fileUpload.parseRequest(request);for(FileItem fileItem : fileItems){//判断是否是文件域isFormField()返回true表示普通表单项 false则是文件域sout(fileItem.isFormField());if(fileItem.isFormField()){//获取请求参数名 getFieldName() 请求参数值 getString(String encoding)sout("参数名:" + fileItme.getFieldName() + ",值:" + fileItem.getString("UTF-8"));}else{//获得提交过来的文件的文件名sout("上传的文件名:" + fileItem.getName());}}}catch(fileUploadException e){e.printStackTrace();}
}

适应IO流的替换,->void write(File file) throw Exception;封装了这个适应IO流的实现code

文件上传

1.改servelt代码upload.jsp -> test

<form action = "UploadServlet" method="post" enctype="multipart/form-data">

    头像:<input type="file" name = "photo">

    姓名:<input type="text" name="name">

    <br>

    <input type="submit" value="上传" /> 提交表单submit reset重置 button普通按钮(需要绑定事件  )

</form>

UploadServlet.java

doPost(){

    DiskFileItem factory = new DiskFileItemFactory();

    Servlet fileUpload = new ServletFileUpload(factory);

    try{

        List<FileItem> fileItem = fileUpload.parseRequest(request);

        for(FileItem fileItem : fileItems){

            //判断是否是文件域isFormField()返回true表示普通表单项 false则是文件域

            sout(fileItem.isFormField());

            if(fileItem.isFormField()){

                //获取请求参数名 getFieldName() 请求参数值 getString(String encoding)

                sout("参数名:" + fileItme.getFieldName() + ",值:" + fileItem.getString("UTF-8"));

            }else{

                //获得提交过来的文件的文件名

                sout("上传的文件名:" + fileItem.getName());

                //上传文件

                File savePathfile = new File("D:\\StorFileDir");//保存路径

                //判断文件夹是否存在

                if(!savePathfile.exits()){//不存在   ->防止文件夹不存在

                    savefile.mkdirs();

                }

                File savefile = new File(savePathfile,fileItem.getName());

                fileItem.write(savefile);

            }

        }

    }catch(fileUploadException e){

        e.printStackTrace();

    }catch(Exception e){

        e.printStackTrace();

    }

}

有个问题?上传的名字冲突问题

/使用客户端上传的文件名作为服务器保存的文件名,可能多个客户端使用相同名字,造成覆盖文件

//需要你实现服务器自动生成不重复的文件名

服务器自动生成不重复的文件名 时间戳(毫秒)+区分名  java的工具类:可以随机生成UUID 是一个算法 或者使用雪花算法

long time = System.currentTimeMillis();

//加上后缀名  要求后缀名与上传的文件名的后缀名是一样的  xxx.jpg

String fileName = fileItem.getItem();

String suffix = fileName.substring(fileName.lastIndexOf("."));

File savefile = new File(savePathfile,time+suffix);

UploadServlet.java

doPost(){

    DiskFileItem factory = new DiskFileItemFactory();

    Servlet fileUpload = new ServletFileUpload(factory);

    try{

        List<FileItem> fileItem = fileUpload.parseRequest(request);

        for(FileItem fileItem : fileItems){

            //判断是否是文件域isFormField()返回true表示普通表单项 false则是文件域

            sout(fileItem.isFormField());

            if(fileItem.isFormField()){

                //获取请求参数名 getFieldName() 请求参数值 getString(String encoding)

                sout("参数名:" + fileItme.getFieldName() + ",值:" + fileItem.getString("UTF-8"));

            }else{

                //获得提交过来的文件的文件名

                sout("上传的文件名:" + fileItem.getName());

                //上传文件

                File savePathfile = new File("D:\\StorFileDir");//保存路径

                //判断文件夹是否存在

                if(!savePathfile.exits()){//不存在   ->防止文件夹不存在

                    savefile.mkdirs();

                }

                long time = System.currentTimeMillis();

                //加上后缀名  要求后缀名与上传的文件名的后缀名是一样的  xxx.jpg

                String fileName = fileItem.getItem();

                String suffix = fileName.substring(fileName.lastIndexOf("."));

                File savefile = new File(savePathfile,fileItem.getName());

                fileItem.write(savefile);

            }

        }

    }catch(fileUploadException e){

        e.printStackTrace();

    }catch(Exception e){

        e.printStackTrace();

    }

}

第二种:UUID的方式

String time = UUID.randomUUID().toString();//生成小写加-分割

String fileName = fileItem.getName();

String suffix = fileName.subString(fileName.lastindexOf(".));

File saveFile = new File(savePathFile,time+suffix);

fileItem.write(saveFile);

优化:去掉-

String time = UUID.randomUUID().toString().toUpperCaea().replace("-","");

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

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

相关文章

学习笔记小结

redis-cluster集群 redis3.0引入的分布式存储方案 集群由多个node节点组成&#xff0c;redis数据分布在这些节点当中。 在集群之中分为主节点和从节点 集群模式当中&#xff0c;主从一一对应&#xff0c;数据的写入和读取与主从模式一样&#xff0c;主负责写&#xff0c;从…

C陷阱与缺陷——第3章 语义陷阱

1. 指针和数组 C语言中只有一维数组&#xff0c;而且数组的大小必须在编译器就作为一个常数确定下来&#xff0c;然而在C语言中数组的元素可以是任何类型的对象&#xff0c;当然也可以是另外的一个数组&#xff0c;这样&#xff0c;要仿真出一个多维数组就不是难事。 对于一个…

iframe

iframe学习 1.iframe是什么&#xff1f; a)iframe是html元素&#xff0c;用于在网页中内嵌另一个网页。 b)iframe默认有一个宽高,存在边界。 c)iframe是一个行内块级元素&#xff0c;可以通过display修改。 2.iframe元素属性有哪些&#xff1f; a)src : 指定内联网页的地…

[教程] 一文进阶Redis

Redis进阶 过期时间&#xff08;Expire&#xff09; Redis 的过期时间&#xff08;Expire&#xff09;功能是一种数据生命周期管理机制&#xff0c;允许为键设置一个过期时间。一旦达到该时间&#xff0c;键会自动被删除。这对于管理缓存数据特别有用&#xff0c;可以自动清理…

Mac电脑版程序创建工具 VMware InstallBuilder Enterprise mac最新

VMware InstallBuilder Enterprise 是一款功能强大、操作简单、跨平台支持的软件安装和部署工具&#xff0c;可以让开发者更加高效地创建和部署软件&#xff0c;并提供了丰富的功能和工具&#xff0c;适用于不同的用户需求和场景。 内置调试器 轻松排除应用程序安装过程中的故…

《LeetCode力扣练习》代码随想录——哈希表(两个数组的交集---Java)

《LeetCode力扣练习》代码随想录——哈希表&#xff08;两个数组的交集—Java&#xff09; 刷题思路来源于 代码随想录 349. 两个数组的交集 Set哈希表 class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer> hashSetnew HashSet<>(…

样品实验EPONEX1510氢化双酚A环氧树脂TDS说明书

样品实验EPONEX1510氢化双酚A环氧树脂TDS说明书 200克 500克 1KG/瓶

nginx-安全防护、跨域、XSS攻击、点击劫持攻击

通过nginx失效安全防护 防止跨域-请求头Content-Security-PolicyCSP配置CSP参数解释CSP指令 防止跨站脚本攻击&#xff08;XSS&#xff09;-请求头X-Xss-Protection配置解释 跨站脚本攻击&#xff08;XSS&#xff09;-请求头X-Content-Type-Options配置解释 防止点击劫持攻击-请…

pyrosetta学习相关(1)

1.前端 PyRosetta脚本的并行化处理 2.Allowing cysteines to repack 3.PyRosetta与多进程处理密集型任务 4.pyrosetta 5.What is Rosetta? 6.PyRosetta FastDesign 7.PyMOL_Mover Tutorial 8.conda pyrosetta3 9.Downloads 10.PyRosetta开发环境配置 11.[Deprecated] Legac…

使用Docker安装Jenkins,解决插件安装失败,版本太低等问题

如果已经遇到插件安装部分失败&#xff0c;Jenkins版本太低&#xff0c;又要换什么清华镜像地址&#xff0c;不要犹豫&#xff0c;直接以下步骤卸载重装就好了 开始安装 yum 更新到最新 yum update到Jenkins官网查找最新的LST版本 最后的版本号一定要带&#xff0c;指定下载具…

使用Spring的@Scheduled注解实现定时任务

摘要&#xff1a;Spring框架提供了强大的定时任务功能&#xff0c;其中Scheduled注解是其中之一。本篇技术博客将介绍如何使用Scheduled注解&#xff0c;在Spring应用程序中实现定时任务的调度与执行。 什么是Scheduled注解&#xff1f; Scheduled是Spring框架中的一个注解&am…

深入探索Maven:优雅构建Java项目的新方式(二)

Meven高级 1&#xff0c;属性1.1 属性1.1.1 问题分析1.1.2 解决步骤步骤1:父工程中定义属性步骤2:修改依赖的version 1.2 配置文件加载属性步骤1:父工程定义属性步骤2:jdbc.properties文件中引用属性步骤3:设置maven过滤文件范围步骤4:测试是否生效 1.3 版本管理 2&#xff0c;…

Sass 安装

文章目录 前言SASS的系统要求安装Ruby例子后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Sass和Less &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&…

Informer辅助笔记:data/dataloader.py

以WTH为例 import os import numpy as np import pandas as pdimport torch from torch.utils.data import Dataset, DataLoader # from sklearn.preprocessing import StandardScalerfrom utils.tools import StandardScaler from utils.timefeatures import time_featuresim…

什么是光模块光模块看我这张就够啦!

1、什么是光模块 信号在光网络中传输时&#xff0c;必须进行光/电转换。光模块就是专门在光网络中完成光/电转换工作的部件。光模块的外观结构如图1所示&#xff0c;简单的来说&#xff0c;双绞线最大传输距离是100米&#xff0c;用的是电信号&#xff0c;那如果说传输距离超过…

骨传导能保护听力吗?使用骨传导有没有副作用?

先说结论&#xff0c;骨传导耳机是可以保护听力的&#xff0c;如果是正常的使用骨传导耳机&#xff0c;是不会有任何副作用的。 一、为什么说骨传导耳机能保护听力 1、佩戴方式更健康 由于骨传导耳机采用耳挂式佩戴&#xff0c;在使用的时候开放双耳&#xff0c;不会堵塞耳道…

搭建完善的绩效管理体系的重点解读

绩效管理最终目的就是实现企业的战略目标&#xff0c;如果没有战略目标作为基础&#xff0c;绩效管理体系就没有了依托&#xff0c;就无法发挥其应有的效用。在实际的企业绩效体系搭建过程中&#xff0c;战略目标的转化是整个体系的“骨架支持”部分&#xff0c;而针对绩效目标…

如何使用vs2022通过excel.exe生成VC、C++能够使用的头文件

我们在开发MFC、VC、C项目时&#xff0c;有时候需要操作excel文件的读写&#xff0c;我们一般常用方式是调用微软的excel驱动方式调用&#xff0c;但调用驱动前&#xff0c;我们需要生成我们C能够调用到的头文件&#xff0c;一般常用文件有&#xff1a; #include "CAppli…

GPT-4 惨遭削弱;拼多多市值一度超阿里;雷军回应个人向武汉大学捐款 13 亿元丨 RTE 开发者日报 Vol.96

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有…

大模型的实践应用10-大模型领域知识与参数高效微调(PEFT)技术的详解,并利用PEFT训练自己的大模型

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用10-大模型领域知识与参数高效微调(PEFT)技术的详解,并利用PEFT训练自己的大模型。大模型领域的参数高效微调技术(PEFT)是指通过对大规模神经网络模型进行高效率的参数微调,以提高模型性能和效率的一种方法。PEFT技术通…