web文件上传一学习记录 (简单的web浏览器可读文件的上传,servlet 文件上传)

文件上传:这里用得时表单上传的方式,表单上传到的时候 method一定指定为POST,enctype="multipart/form-data".

第一种方式,直接上传、读取、显示内容,并没有存储到服务器端。

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%
3 String path = request.getContextPath();
4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
5 %>
6
7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
8 <html>
9 <head>
10 <base href="<%=basePath%>">
11
12 <title>My JSP ‘fileUpLoad.jsp‘ starting page</title>
13
14 <meta http-equiv="pragma" content="no-cache">
15 <meta http-equiv="cache-control" content="no-cache">
16 <meta http-equiv="expires" content="0">
17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18 <meta http-equiv="description" content="This is my page">
19 <!--
20 <link rel="stylesheet" type="text/css" href="styles.css">
21 -->
22
23 </head>
24
25 <body>
26 第一种文件上传,没有设置上传路径,就只是简单的读取。
27 <!-- method="post" enctype="multipart/from-data"必须这样的 -->
28 <form action="fileUploadRest.jsp" method="post" enctype="multipart/form-data">
29 username:<input type="text" name="username"><br>
30 file:<input type="file" name="file"><br>
31 <input type="submit" value="submit">
32 </form>
33 </body>
34 </html>

fileUpLoad.jsp

然后再第二个JSP页面中读取展示所上传的内容。

request.getInputStream();文件通过表单的方式上传的时候,再服务器端会有一个与之对应的流,可以通过request.getInputStream();获取这个流,并向普通流一样处理。

这个jsp页面也写了servlet 上传的方式。

 1 <%@page import="java.io.InputStreamReader"%>
2 <%@page import="java.io.BufferedReader"%>
3 <%@page import="java.io.InputStream"%>
4 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
5 <%
6 String path = request.getContextPath();
7 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
8 %>
9
10 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
11 <html>
12 <head>
13 <base href="<%=basePath%>">
14
15 <title>My JSP ‘fileUploadRest.jsp‘ starting page</title>
16
17 <meta http-equiv="pragma" content="no-cache">
18 <meta http-equiv="cache-control" content="no-cache">
19 <meta http-equiv="expires" content="0">
20 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
21 <meta http-equiv="description" content="This is my page">
22 <!--
23 <link rel="stylesheet" type="text/css" href="styles.css">
24 -->
25 </head>
26
27 <body>
28 username: <%=request.getParameter("username") %><br>
29
30 <% InputStream is = request.getInputStream();
31 BufferedReader br = new BufferedReader(new InputStreamReader(is));
32 String buffer = null;
33 while(null!=(buffer = br.readLine()))
34 {
35 out.print(buffer + "<br>");
36 }
37 br.close();
38 is.close();
39 %>
40
41
42
43 第二种方式:servlet文件上传<br>
44 <form action="FileUpload" method="post" enctype=multipart/form-data >
45 Username:<input type="text" name="filename" ><br>
46 File:<input type="file" name="file"><br>
47 File2:<input type="file" name="file2"><br>
48 <input type="submit" value="submit">
49 </form>
50
51 </body>
52 </html>

fileUploadRest.jsp

处理文件上传得Servlet

 1 package servlet_p;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.io.OutputStream;
8 import java.io.PrintWriter;
9 import java.util.List;
10
11 import javax.servlet.ServletException;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15
16 import org.apache.commons.fileupload.FileItem;
17 import org.apache.commons.fileupload.FileUploadException;
18 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
19 import org.apache.commons.fileupload.servlet.ServletFileUpload;
20
21 public class FileUpload extends HttpServlet
22 {
23 /**
24 * 文件上传用到的包
25 * comment-fileupload.jar 依赖于comment-io.jar
26 */
27 public void doPost(HttpServletRequest request, HttpServletResponse response)
28 throws ServletException, IOException
29 {
30 //文件工厂类的实例
31 DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
32 String path = request.getRealPath("/upload");
33 //setRepository设置缓冲目录(文件大于制定大小的时候存放临时文件 默认10240)
34 diskFileItemFactory.setRepository(new File(path));
35 diskFileItemFactory.setSizeThreshold(1024*1024*10);//指定默认文件最大值
36 ServletFileUpload upload = new ServletFileUpload(diskFileItemFactory);
37
38 try
39 {//FileItem文件条目 代表一个文件或者一个表单的元素
40 List<FileItem> list = upload.parseRequest(request);
41 for(FileItem fileItem:list)
42 {//fileItem.isFormField() 是不是一个普通的表单的元素
43 //获得文件或者表单元素的名字
44 String name = fileItem.getFieldName();
45 if(fileItem.isFormField())
46 {
47 String value = fileItem.getString();
48 System.out.println(name+ " " +value);
49 request.setAttribute(name, value);
50 }
51 else
52 {
53 String value=fileItem.getName();//获得上传文件的名字
54 // 有的浏览器得到不仅仅有文件名,还有磁盘信息
55 // int start = value.lastIndexOf("\\");
56 // 截取即可
57 // String fileName = value.substring(start + 1);
58 request.setAttribute(name, value);
59
60 // fileItem.write(new File(path,value));//写入到本地
61
62 //自己的方式会产生临时文件不会删除 上面的write会删掉
63 OutputStream os = new FileOutputStream(new File(path,value));
64 InputStream is = fileItem.getInputStream();
65 fileItem.getSize();//获得文件的总得字节数 与length 相比可获得百分比
66 int length = 0;
67 byte[] buffer = new byte[400];
68 while(-1!=(length = is.read(buffer)))
69 {
70 os.write(buffer, 0, length);
71 }
72 os.close();
73 is.close();
74 System.out.println(path);
75 }
76 }
77 } catch (Exception e)
78 {
79 e.printStackTrace();
80 }
81 request.getRequestDispatcher("fileUploadResult2.jsp").forward(request, response);
82 }
83
84 }

FileUpload

用到的jar包 comment-fileupload.jar  
comment-io.jar,文件上传时多个文件的上传与j单个文件的上传没什么大区别,只是处理的时候把所有上传的文件放到List集合里面。

上传之后转到结果页展示已上传的文件即可:

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%
3 String path = request.getContextPath();
4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
5 %>
6
7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
8 <html>
9 <head>
10 <base href="<%=basePath%>">
11
12 <title>My JSP ‘fileUploadResult2.jsp‘ starting page</title>
13
14 <meta http-equiv="pragma" content="no-cache">
15 <meta http-equiv="cache-control" content="no-cache">
16 <meta http-equiv="expires" content="0">
17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18 <meta http-equiv="description" content="This is my page">
19 <!--
20 <link rel="stylesheet" type="text/css" href="styles.css">
21 -->
22
23 </head>
24
25 <body>
26 username = ${requestScope.filename}<br>
27 File =${requestScope.file}
28 File2=${requestScope.file2}
29 </body>
30 </html>

DiskFileItemFactory FileItem ServletFileUpload
这三个类是这里主要使用的类关于这三个类的介绍主要就介绍DiskFileItemFactory

DiskFileItemFactory :(转自:http://blog.csdn.net/chinaliuyan/article/details/7002016

将请求消息实体中的每一个项目封装成单独的DiskFileItem (FileItem接口的实现) 对象的任务

org.apache.commons.fileupload.FileItemFactory
接口的默认实现 
org.apache.commons.fileupload.disk.DiskFileItemFactory
来完成。当上传的文件项目比较小时,直接保存在内存中(速度比较快),比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,但是内存资源是有限的)。

属性
1) public static final int
DEFAULT_SIZE_THRESHOLD :将文件保存在内存还是磁盘临时文件夹的默认临界值,值为10240,即10kb。

2) private File
repository:用于配置在创建文件项目时,当文件项目大于临界值时使用的临时文件夹,默认采用系统默认的临时文件路径,可以通过系统属性
java.io.tmpdir获取。如下代码:

System.getProperty("java.io.tmpdir");

3) private int sizeThreshold:用于保存将文件保存在内存还是磁盘临时文件夹的临界值

构造方法
1) public
DiskFileItemFactory()

采用默认临界值和系统临时文件夹构造文件项工厂对象。

2) public DiskFileItemFactory(int sizeThreshold,File
repository)

采用参数指定临界值和系统临时文件夹构造文件项工厂对象。

3) FileItem
createItem() 
      
根据DiskFileItemFactory相关配置将每一个请求消息实体项目创建成DiskFileItem
实例,并返回。该方法从来不需要我们亲自调用,FileUpload组件在解析请求时内部使用。

4) void setSizeThreshold(int
sizeThreshold)
       
Apache文件上传组件在解析上传数据中的每个字段内容时,需要临时保存解析出的数据,以便在后面进行数据的进一步处理(保存在磁盘特定位置或插入数据库)。因为Java虚拟机默认可以使用的内存空间是有限的,超出限制时将会抛出“java.lang.OutOfMemoryError”错误。如果上传的文件很大,例如800M的文件,在内存中将无法临时保存该文件内容,Apache文件上传组件转而采用临时文件来保存这些数据;但如果上传的文件很小,例如600个字节的文件,显然将其直接保存在内存中性能会更加好些。

setSizeThreshold方法用于设置是否将上传文件已临时文件的形式保存在磁盘的临界值(以字节为单位的int值),如果从没有调用该方法设置此临界值,将会采用系统默认值10KB。对应的getSizeThreshold()
方法用来获取此临界值。

5) void setRepository(File
repository)
       
setRepositoryPath方法用于设置当上传文件尺寸大于setSizeThreshold方法设置的临界值时,将文件以临时文件形式保存在磁盘上的存放目录。有一个对应的获得临时文件夹的
File getRespository() 方法。

注意:当从没有调用此方法设置临时文件存储目录时,默认采用系统默认的临时文件路径,可以通过系统属性 java.io.tmpdir
获取。如下代码:

System.getProperty("java.io.tmpdir");

Tomcat系统默认临时目录为“<tomcat安装目录>/temp/”。

时间: 2024-12-04 21:51:20

web文件上传一学习记录 (简单的web浏览器可读文件的上传,servlet 文件上传)的相关文章

关于java web开发需要哪些技术要求(简单的web界面管理系统)

目前, 国内外信息化建设已经进入基于Web应用为核心的阶段, Java作为应用于网络的最好语言,前景无限看好.然而,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情.概括一下,实施Java的WEB项目需要掌握的技术如下: lJava语言 l面向对象分析设计思想 l设计模式和框架结构 lXML语言 l网页脚本语言 l数据库 l应用服务器 l集成开发环境 下面我们具体地看每个技术. 1.Java语言 Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servle

Java设计模式学习记录-简单工厂模式、工厂方法模式

前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类)用来制造对象. 当一个人想要用手机的时候,需要自己创建手机然后来使用. 如下: public class IphoneX { public IphoneX(){ System.out.println("##### 制造iphoneX #####"); } } public class I

LESS 学习记录(简单入门)

什么是 LESS LESS是一种动态样式语言,属于 CSS 预处理语言的一种.它使用类似 CSS 的语法,但是 赋予了动态语言的特性,比如变量.继承.运算.函数等,方便 CSS 的编写和维护. 使用 LESS 在开发环境下的时候,推荐直接使用浏览器使用 LESS. 下载 LESS.js 文件. 页面中引入 styles.less 文件所有 .less 必须在 LESS.js 前引入.(服务器必须设置 .less 文件的 MIME 为 text/css) 引入 JS 文件 开发完毕后,推荐使用 n

Web Service简要概念,学习记录!

Web Service平台需要一套协议来实现分布式应用程序的创建.任何平台都有它的数据表示方法和类型系统.要实现互操作性,Web Service平台必须提供一套标准的类型系统,用于沟通不同平台.编程语言和组件模型中的不同类型系统.这些协议有: XML和XSD 可扩展的标记语言(标准通用标记语言下的一个子集)是Web Service平台中表示数据的基本格式.除了易于建立和易于分析外,XML主要的优点在于它既与平台无关,又与厂商无关.XML是由万维网协会(W3C)创建,W3C制定的XML Schem

前端小白之每天学习记录----简单的原生js路由

路由: 根据不同的url 显示 不同的内容方法:hash(锚链接)实现路由history对象 1.首先要了解什么是hash,在这里你可以认为hash就是网址后面加上的 #/xxx 当<a>标签被点击时 <a href="#/html">ches</a>会在原网址后面加上<a>里面herf的内容,当该内容改变时,会产生一个事件 onhashchange 话不多说,直接上代码: <!DOCTYPE html> <html l

[学习记录]面对wxpython的长跑(100米:wxpython安装,相关文件,wx.App,wx.Frame)

被老师要求,已经是不得不进行图形界面的开发了,因为程序本体使用python写的,所以自然第一次进行图形界面开发就选择了wxpython,wxpython是一款非常优秀的GUI图形库,写起来也相对简洁方便. 安装时直接pip install wxpython即可. demo程序以及其它官方相关文件下载地址:https://extras.wxpython.org/wxPython4/extras/ 官方文档:https://docs.wxpython.org/wx.1moduleindex.html

Python学习记录day3

Python学习记录 day3 今天是银角大王武sir讲课.先回顾了上节课所学,然后讲到了面向对象思想. set set是一个无序且不重复,可嵌套的元素集合 class set(object):     """     set() -> new empty set object     set(iterable) -> new set object     Build an unordered collection of unique elements.     

saltstack学习记录

安装 pip 安装 注意  依赖到zeromq3 minion过一段时间去请求master salt-api  可以访问salt去远程执行 ruby puppet   DSL配置   erb文件  模块  加载  模板支持最差 chef     定义直接是ruby代码   erb模板系统   原生支持 python saltstack   yaml配置文件    python程序模板   模板支持很好 python写模块 ipc 进程间通信 都使用key认证    安全 salt-key  -L

Apache Shiro 学习记录4

今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了....而这些地方又是蛮难的..比如3.5节Authorizer.PermissionResolver及RolePermissionResolver...可能作者觉得讲清楚要花太多的篇幅涉及太多的类吧.....但是我看起来就很不爽0.0....既然提到了就想弄明白.....不然太纠结了....所以就有了这篇