Servlet 文件上传

Servlet 可以与 HTML form 标签一起使用,来允许用户上传文件到服务器。上传的文件可以是文本文件或图像文件或任何文档。

本文使用到的文件有:

创建一个文件上传表单

下面的 HTML 代码创建了一个文件上传表单。以下几点需要注意:

  • 表单 method 属性应该设置为 POST 方法,不能使用 GET 方法。 
  • 表单 enctype 属性应该设置为 multipart/form-data. 多部分表单    参考深入解析multipart/form-data
  •  使用multipart/form-data.  后   使用request.getParameter()  将返回空值  因为是分部分的 请求体  有个分割线的 属性  无法直接获得参数
  • 表单 action 属性应该设置为在后端服务器上处理文件上传的 Servlet 文件。下面的实例使用了 UploadServlet Servlet 来上传文件。
  • 上传单个文件,您应该使用单个带有属性 type="file" 的 <input .../> 标签。为了允许多个文件上传,请包含多个 name 属性值不同的 input 标签。输入标签具有不同的名称属性的值。浏览器会为每个 input 标签关联一个浏览按钮。
  •  原理:

     

    html 代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="/WEB32/fileuploadServlet2" method="post" enctype="multipart/form-data">
        <input type="text" name="username"><br>
        <input type="file" name="filename"><br>
        <input type="submit" value="上传文件">
    </form>
</body>
</html>

 servlet部分代码

以下是 UploadServlet 的源代码,同于处理文件上传,在这之前我们先确保依赖包已经引入到项目的 WEB-INF/lib 目录下:

  • 下面的实例依赖于 FileUpload,所以一定要确保在您的 classpath 中有最新版本的 commons-fileupload.x.x.jar 文件。可以从 http://commons.apache.org/proper/commons-fileupload/ 下载。
  • FileUpload 依赖于 Commons IO,所以一定要确保在您的 classpath 中有最新版本的 commons-io-x.x.jar 文件。可以从 http://commons.apache.org/proper/commons-io/ 下载。

你可以直接下载本站提供的两个依赖包:

  • commons-fileupload-1.3.2.jar
  • commons-io-2.5.jar
package com.itheima;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;public class FileuploadServlet2 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {//1、创建磁盘文件项工厂//作用:设置缓存文件的大小  设置临时文件存储的位置String path_temp = this.getServletContext().getRealPath("temp");//DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024, new File(path_temp));DiskFileItemFactory factory = new DiskFileItemFactory();factory.setSizeThreshold(1024*1024);factory.setRepository(new File(path_temp));//2、创建文件上传的核心类ServletFileUpload upload = new ServletFileUpload(factory);//设置上传文件的名称的编码upload.setHeaderEncoding("UTF-8");//ServletFileUpload的APIboolean multipartContent = upload.isMultipartContent(request);//判断表单是否是文件上传的表单if(multipartContent){//是文件上传的表单//***解析request获得文件项集合List<FileItem> parseRequest = upload.parseRequest(request);if(parseRequest!=null){for(FileItem item : parseRequest){//判断是不是一个普通表单项boolean formField = item.isFormField();if(formField){//username=zhangsanString fieldName = item.getFieldName();String fieldValue = item.getString("UTF-8");//对普通表单项的内容进行编码
                            System.out.println(fieldName+"----"+fieldValue);//当表单是enctype="multipart/form-data"时 request.getParameter相关的方法//String parameter = request.getParameter("username");
                            }else{//文件上传项//文件的名String fileName = item.getName();//获得上传文件的内容InputStream in = item.getInputStream();String path_store = this.getServletContext().getRealPath("upload");OutputStream out = new FileOutputStream(path_store+"/"+fileName);IOUtils.copy(in, out);in.close();out.close();//删除临时文件
                            item.delete();}}}}else{//不是文件上传表单//使用原始的表单数据的获得方式 request.getParameter();
            }} catch (FileUploadException e) {e.printStackTrace();}}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

web.xml

<servlet><description></description><display-name>FileuploadServlet2</display-name><servlet-name>FileuploadServlet2</servlet-name><servlet-class>com.itheima.FileuploadServlet2</servlet-class></servlet><servlet-mapping><servlet-name>FileuploadServlet2</servlet-name><url-pattern>/fileuploadServlet2</url-pattern></servlet-mapping>

 

转载于:https://www.cnblogs.com/qinning/p/9979637.html

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

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

相关文章

java学习(92):线程的创建方法一

//线程的创建方法1class Xc extends Thread {public void run(){for (int i0;i<20;i){System.out.println("我是歌谣");}} } public class test27{public static void main(String[] args){Xc xcnew Xc();xc.start();//程序会自动调用run方法for (int i0;i<20;…

java学习(93):线程的创建方法二

//创建线程的第二种方法class Xc2 implements Runnable {public void run(){for (int i0;i<20;i){System.out.println("我是歌谣");}} } public class test28{public static void main(String[] args){Xc2 xc2new Xc2();Thread anew Thread(xc2);a.start();//xc.s…

Pycharm使用之设置代码字体大小和颜色主题

1. File->Setting 打开如下所示的对话框&#xff0c;可以在Editor->General->Font下设置字体大小&#xff08;Size&#xff09;、行距&#xff08;Line spacing&#xff09; 2. Editor->Color Scheme 展开如下所示内容&#xff0c;可以选择自己喜欢的主题样式&am…

c语言分量的运算符,C语言基础(04-运算符和表达式)

运算符(也叫操作符)&#xff0d;&#xff0d;运算符是一个表示特定的数学或逻辑操作的符号。如号&#xff0c;表示了一个相加运算&#xff1b;&&号表示了一个逻辑‘与’的运算。由运算符把需要进行运算的各个量(常量或变量)连接起来组成一个表达式。下面要讲的是标准的…

java学习(94):cpu随机调用线程测试

//创建线程 class Xc3 extends Thread {public void run(){System.out.println("当前线程的名称为"Thread.currentThread().getName());} } public class test29{public static void main(String[] args){Xc3 xc3new Xc3();xc3.setName("线程1");//程序会自…

Linux学习——echo和read命令用法

转载自http://www.runoob.com/linux/linux-comm-read.html http://www.178linux.com/76331 echo命令 本文列举了echo命令的几个常用用法并加以实例说明&#xff0c;以作回顾、参考。 echo命令常用作打印输出字符串&#xff0c;根据echo帮助文件可以获得以下信息&#xff1a; 语…

w ndows 高级索引,软媒原创:为Windows7建立索引,搜索文件更给力

Win7之家(www.win7china.com)&#xff1a;软媒原创&#xff1a;为Windows7建立索引&#xff0c;搜索文件更给力也许你还记得XP时代搜索文件时出现的那只黄色的小狗狗&#xff0c;在Windows7时代&#xff0c;搜索变得更加快捷顺手&#xff0c;搜索栏就在那里&#xff0c;不点不搜…

java学习(95):线程的优先级

public class test30 {public static void main(String[] args){Thread xc11new Thread(new Xc41());Thread xc12new Thread(new Xc42());xc11.setPriority(Thread.NORM_PRIORITY3);//数字越大&#xff0c;优先级越高&#xff0c;默认为5xc11.start();xc12.start();} } class X…

java学习(96):线程的睡眠

//线程的睡眠 public class test31 {public static void main(String[] args){Xc43 xc43new Xc43();Thread cccnew Thread(xc43);ccc.start();} } class Xc43 implements Runnable {public void run(){for (int i0;i<10;i){System.out.println(Thread.currentThread().getNa…

java学习(97):中断线程的另一种处理

public class test32 {public static void main(String[] args){Thread xc13new Thread(new Xc44());Thread xc14new Thread(new Xc44());xc13.setName("线程一");xc14.setName("线程二");xc13.start();xc14.start();} } class Xc44 implements Runnable {…

调试nodejs项目接口,使用Posman,用req.body拿不到数据

近日在postman 上面测试nodejs写的post接口&#xff0c;发现后台接受不到数据。 很多人其实不知道怎么postman 上面GET和POST怎么使用的 Postman接口操作 1.GET请求操作&#xff1a; 2.GET请求操作结果&#xff1a; 3.POST请求操作&#xff1a; 4.POST请求操作结果&#xff1a;…

x-lite for linux,Linux Lite 4.6正式发布:现基于Ubuntu 18.04.3 LTS

原标题&#xff1a;Linux Lite 4.6正式发布&#xff1a;现基于Ubuntu 18.04.3 LTS创建者Jerry Bezencon于今天正式宣布Linux Lite 4.6系统版本更新&#xff0c;和上个版本4.4相隔5个月时间。新版本基于Canonical最近发布的Ubuntu 18.04.3 LTS(Bionic Beaver)操作系统&#xff0…

java学习(98):线程join使用中断进行另一个

public class test33 {public static void main(String[] args) {Xc46 xc46new Xc46();Thread dd new Thread(xc46);dd.start();try {dd.join();} catch (Exception e) {}for (int i0;i<15;i) {System.out.println("主函数"i);}} } class Xc46 implements Runna…

java学习(99):车站卖票问题

//买票问题 class Xc9 implements Runnable{public static int chepiao100;static String aanew String("1");//字符串随意定义&#xff0c;定义在函数上面public void run(){while (true){synchronized (aa) //可以修饰代码块&#xff0c;又可以修饰函数/*try{Thre…

java学习(100):集合类简介

//集合类的作用 public class test35 {private String name;private int num;private int grade;public test35(String name,int num,int grade){this.namename;this.numnum;this.gradegrade;}public String getName() {return name;}public int getGrade() {return grade;}pub…

第六天任务情况

今天的任务是完善程序再加入一个物理实验,我们的软件功能是能够添加各种实验包括公用的还是专业内的都可以纳入到我们的软件中, 可以想下载哪个下载哪个,不过这都是日后的目标了,我们现在制作出一个简单的程序和资源还不能分开的软件,希望越来越好吧 昨日任务:代码对接 今日任务…

java学习(102):arraylist的查询和删除

arraylist的查询和删除 //arraylist的遍历和增加 import java.util.ArrayList;public class test38 {public static void main(String[] args){ArrayList aa1new ArrayList();//当前对象个数System.out.println(aa1.size());test35 xs1new test35("歌谣",3,4);test35…

Android11怎么截屏,对标IOS?Android11或无缘屏幕长截图

我收集了一些学习用的资料&#xff0c;其中包含了很多学习&#xff0c;面试&#xff0c;中高进阶fluuter资料&#xff0c;还有很多视频详解&#xff0c;如果有同学想进一步了解&#xff0c;详情请看文末。也欢迎各路大神门前来装X。一直以来&#xff0c;不少用户都很喜欢用长截…

第一批升级鸿蒙系统,鸿蒙系统公开了第一批升级名单,果粉认为不地道

鸿蒙系统鸿蒙系统对于很多人来说并不陌生&#xff0c;它由华为独自研发&#xff0c;同样也代表着中国技术能力上的提升。还记得鸿蒙系统是在去年华为开发者大会上与广大用户见面&#xff0c;不仅招来了很多人的目光&#xff0c;并且一下子将知名度提高了许多。人们都想知道第一…

linux vma,内存管理 – Linux内核API find_vma

find_vma函数功能描述&#xff1a;find_vma( )函数根据一个属于某个进程的虚拟地址&#xff0c;找到其所属的进程虚拟区间&#xff0c;并返回相应的vma_area_struct结构体指针。find_vma文件包含#includefind_vma函数定义在内核源码中的位置&#xff1a;linux-3.19.3/mm/mmap.c…