一、Servlet文件上传
1.上传jsp页面[上传到fileResult.jsp页面]
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>上传文件</title> </head> <body> <form action="fileResult.jsp" method="post" enctype="multipart/form-data"> <!--method必须设为post,因为get有最大限度256k,太大就带不上去--> <!--enctype="multipart/form-data"上传的是多种类型数据,不再只是文本.也就是说当去掉这个标签,传递的便是文本[传输文件的文件名]--> username:<input type="text" name="username"/><br/> file1:<input type="file" name="file1"/><br/> <input type="submit" value="submit"/> </form> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*,java.io.*" %><!--导入包--> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>上传结果</title> </head> <body> <!--上传http协议,底层是tcp协议。tcp协议是有连接的,可以获得流--> <% InputStream is = request.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String buffer = null; while(null != (buffer=br.readLine())){ out.print(buffer+"<br/>");//读取流中的数据 } //需要关两个流,因为字节输入流是通过request中获取的 br.close(); is.close(); %> <!--取文本的方式,无法获取文件...--> <!--username:<%=request.getParameter("username") %> file1:<%=request.getParameter("file1") %>--> </body> </html>
输出流中打印的信息
2.Servlet上传[导入commons-fileupload-1.2.2.jar、commons-io-2.0.1.jar,在WebRoot下创建upload文件夹保存上传的文件]
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>上传文件</title> </head> <body> <form action="servlet/FileUploadServlet" method="post" enctype="multipart/form-data"> <!--上传到指定的servlet类中--> username:<input type="text" name="username"/><br/> file1:<input type="file" name="file1"/><br/> <input type="submit" value="submit"/> </form> </body> </html>
servlet类
package com.struts.servlet; import java.io.File; import java.io.IOException; 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.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 获得保存上传文件路径,在webRoot下的upload String path = request.getRealPath("/upload"); System.out.println("path=" + path); // 确定文件上传到的路径 DiskFileItemFactory factory = new DiskFileItemFactory(); // 相当于上传文件的仓库,存放上传文件 这里的File是目录 factory.setRepository(new File(path)); // 如果上传的文件比较小,先放在内存中,再放到保存路径中 // 如果上传的文件比较大,内存不能满足,先放在缓存区中,在保存到指定路径中 // 上传多大时需要使用缓冲区,可以通过setSizeThreshold()设置 factory.setSizeThreshold(1024 * 1024); // 文件上传 ServletFileUpload upload = new ServletFileUpload(factory); try { // 将客户端发送过来的请求进行解析 List<FileItem> list = (List<FileItem>) upload.parseRequest(request); // list中存储的是传过来的多个文件、多个文本 for (FileItem item : list) { String name = item.getFieldName(); if (item.isFormField()) {// 如果是属性,也就是文本标签而并非文件 String value = item.getString(); System.out.println(name + "=" + value); request.setAttribute(name, value); } else { // 上传文件 // 获得文件名,一般浏览器解析文件名后只要文件名, // 而一些浏览器解析方式不同,会将全部文件整个路径输出, //对于这些浏览器的解析方式做些处理 String value = item.getName(); //当文件名为全路径时,从后往前取到的第一个\之后便是文件名 //若文件名并非全路径时,从后往前取第一个\是取不到的,返回-1,-1+1=0,从第0位开始取文件名也是对的 //file1=C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg //file1=Chrysanthemum.jpg int start = value.lastIndexOf("\\"); System.out.println("start:"+start); String fileName = value.substring(start+1); request.setAttribute(name, fileName); System.out.println(name + "=" + value); System.out.println(name + "=" + fileName); //将文件写到指定的路径中(路径下面创建一个文件) item.write(new File(path,fileName)); } } } catch (Exception ex) { ex.printStackTrace(); } //跳转到指定的页面 request.getRequestDispatcher("/fileResult.jsp").forward(request,response); } }
package com.struts.servlet; 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.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 获得保存上传文件路径,在webRoot下的upload String path = request.getRealPath("/upload"); System.out.println("path=" + path); // 确定文件上传到的路径 DiskFileItemFactory factory = new DiskFileItemFactory(); // 相当于上传文件的仓库,存放上传文件 这里的File是目录 factory.setRepository(new File(path)); // 如果上传的文件比较小,先放在内存中,再放到保存路径中 // 如果上传的文件比较大,内存不能满足,先放在缓存区中,在保存到指定路径中 // 上传多大时需要使用缓冲区,可以通过setSizeThreshold()设置 factory.setSizeThreshold(1024 * 1024); // 文件上传 ServletFileUpload upload = new ServletFileUpload(factory); try { // 将客户端发送过来的请求进行解析 List<FileItem> list = (List<FileItem>) upload.parseRequest(request); // list中存储的是传过来的多个文件、多个文本 for (FileItem item : list) { String name = item.getFieldName(); if (item.isFormField()) {// 如果是属性,也就是文本标签而并非文件 String value = item.getString(); System.out.println(name + "=" + value); request.setAttribute(name, value); } else { // 上传文件 // 获得文件名,一般浏览器解析文件名后只要文件名, // 而一些浏览器解析方式不同,会将全部文件整个路径输出, //对于这些浏览器的解析方式做些处理 String value = item.getName(); //当文件名为全路径时,从后往前取到的第一个\之后便是文件名 //若文件名并非全路径时,从后往前取第一个\是取不到的,返回-1,-1+1=0,从第0位开始取文件名也是对的 //file1=C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg //file1=Chrysanthemum.jpg int start = value.lastIndexOf("\\"); System.out.println("start:"+start); String fileName = value.substring(start+1); request.setAttribute(name, fileName); System.out.println(name + "=" + value); System.out.println(name + "=" + fileName); //将文件写到指定的路径中(路径下面创建一个文件) //item.write(new File(path,fileName)); //自定义输出 OutputStream os = new FileOutputStream(new File(path,fileName)); InputStream is = item.getInputStream(); byte[] buffer = new byte[400]; int length = 0; while(-1!=(length=is.read(buffer))){ os.write(buffer,0,length); } is.close(); os.close(); } } } catch (Exception ex) { ex.printStackTrace(); } //跳转到指定的页面 request.getRequestDispatcher("/fileResult.jsp").forward(request,response); } }
对比item.write(new File(path,fileName));与自定义输出的差别
自定义输出大文件时,传入文件的同时会创建一个临时文件。而使用item.write()方法时,内部完成了把后缀名为tmp的文件删除
//item.getSize()获得文件传输长度,可以通过ajax动态调用,比对文件大小与传输大小,获得文件传输进度
相关推荐
2023-04-06-项目笔记-第三百二十八阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的...
网络管理员笔记-软考笔记(超级详细!!!超级认真)软考学习笔记(带资料!!)a网络管理员考试介绍。都是自己做的!!!制作不易!点个赞哈!!都是根据视频一步一步做出来的,带真题的笔记,考前复习一遍记过!...
2023-04-08 项目笔记-第一阶段-第2节-分支和循环语句-3.3.2执行流程 3.3.3do语句的特点 3.3.4do while循环中的break和continue 3.4练习 3.4.1练习参考代码:3.4.2折半查找算法 3.4.3猜数字游戏实现 4.goto语句 5....
标题中的"halo-backup-markdown-2022-09-25-16-08-11--936459594.zip"表明这是一个备份文件,使用了Markdown格式,并且时间戳显示它是2022年9月25日下午4点8分11秒创建的,这通常是为了记录或保存某个时刻的数据状态...
25. sh 26. ps 27. sed 28. cal 29. lp 四、正则表达式基础知识 正则表达式是一种特殊的字符模式,用来在一次搜索中匹配相同字符。常见的正则表达式元字符包括: 1. ^ 行开头定位 2. $ 行末尾定位 3. . 匹配单个...
11-VRP基础 12-VRP远程管理 13-VRP文件系统 14-VRP系统管理 15-路由基础 16-静态路由 17-动态路由 18-RIP 19-OSPF 20-路由认证 21-缺省路由的发布 22-交换机基础 23-VLAN 24-VLAN间路由 25-GARP-GVRP ...
Eclipse插件开发 学习笔记 第二篇 核心技术(11-16).rar Eclipse插件开发 学习笔记 第二篇 核心技术(17-21).rar Eclipse插件开发学习笔记 第三四篇(22-25).rar Eclipse插件开发学习笔记 第三四篇(26-28)+原代码.rar ...
11. 低功耗聆听模式:在聆听模式下,电流消耗为1.37μA(典型值)。 12. 数据速率:可以在0.5-4kbps之间调整(曼彻斯特)。 13. 曼彻斯特解码时钟恢复:在解码曼彻斯特编码数据时,能够恢复出时钟信号。 14. 数字...
### Oracle-ERP开发笔记知识点概览 #### 一、Oracle Forms基础 **1. 设置ITEM为必填项** - 在Oracle Forms中,可以为特定的ITEM(字段)设置必填属性,确保用户在提交表单之前必须填写这些字段。这通常通过属性...
Eclipse插件开发 学习笔记 第二篇 核心技术(11-16).rar Eclipse插件开发 学习笔记 第二篇 核心技术(17-21).rar Eclipse插件开发学习笔记 第三四篇(22-25).rar Eclipse插件开发学习笔记 第三四篇(26-28)+原代码.rar ...
例如,电影通常为25帧/秒,而Flash动画的帧频可以根据需求设置,早期的标准是12帧/秒,但现在常提升至24-36帧/秒。 二、Flash制作流程 1. 新建文件:使用Ctrl+N快捷键创建新项目,并在"文档"选项中设置合适的尺寸和...
RHCE课程-RH033Linux基础笔记一 10月25日课程 4、安装LINUX及常用命令介绍 RHCE课程-RH033Linux基础笔记二 10月26日课程 5、文件以及文件权限 RHCE课程-RH033Linux基础笔记三 10月26日部分课程;11月1日课程;11月2...
│ 融会贯通Oracle数据库的25条基本知识.txt │ 详细讲解Oracle服务器的常用命令行.mht │ └─资料 │ Ora 10G Err_Msg.chm │ Oracle10g_DBA.pdf │ Oracle10G官方文档CHM合集SQL参考手册.pdf │ Oracle9i...
24-机器学习介绍 20-天天果园项目 06-MySQL 19-Django 22-爬虫高级 18-博客项目 14-HTML&CSS第二部分 15-前端项目 08-多线程 16- flask 23-Numpy基础,数据分析 31-股票分析系统 ...30-....25-决策树 ...11-Git
25. **绘制工具组**:如矩形工具(M)、椭圆工具(L)、圆角矩形、多边形工具、星形工具等,都有特定的绘制和修改方法。 26. **文字工具**:`T`,`Alt+上下箭头`调整行距,`Alt+左右箭头`调整字距。 27. **路径...
11、JavaSE:多线程 12、JavaSE:网络编程 13、JavaSE:Gui编程 14、JavaSE:注解和反射 15、MySQL和JDBC 16、前端:Html5 17、前端:CSS3 18、前端:JavaScript、jQuery 19、JavaWeb 20、MyBatis 21、Spring 22、...
Eclipse插件开发 学习笔记 第二篇 核心技术(11-16).rar Eclipse插件开发 学习笔记 第二篇 核心技术(17-21).rar Eclipse插件开发学习笔记 第三四篇(22-25).rar Eclipse插件开发学习笔记 第三四篇(26-28)+原代码.rar ...
11. 抽象函数重写基类虚函数 可以,抽象函数可以重写基类的虚函数,但抽象函数本身没有实现,必须在子类中提供具体实现。 12. 封锁类的虚函数 封锁类不能有虚函数,因为密封类禁止继承,也就无法在子类中重写它的...
25、引入路由1 35 26、引入路由2 36 27、默认路由 39 28、PBR 40 29、IGMP 42 30、PIM-DM 44 31、PIM-SM 44 二、华为HCDP IESN学习笔记 46 1、 VLAN 1 46 2、 VLAN 2 (Hybrid) 48 3、 VLAN 3 (Mux VLAN) 49 4、 ...