1:我们学的是表单文件上传,就是在一个FORM中提交相应的信息,和之前我们的提交的注册信息之类的表单是不同的,所以要先改变一下FORM的属性,enctype="multipart/form-data“,这个属性告诉服务器,我们是要提交文件了,而不是一个表单。
在服务器端也需要判断下
boolean isUpload = ServletFileUpload.isMultipartContent(request);
判断请求中是否有这种标示。
2:<input type=“file” />这是表单中用来选择上传文件用的,在表单中有这个元素后,会会自动生成一个输入框和一个按钮,作用和awt中的FileDialog类的作用蛮像的。
3:我们主要使用Commons-fileupload.jar中的类,commons-io是提供流服务用的,我们没有对它进行操作。
主要使用的如下:
FileItem-------DiskFileItemFactory-----ServletFileUpload
作用:
FileItem 用来封装表单中的元素和数据。
ServletFileUpload 处理表单数据,将数据封装到 FileItem 对象中。
DiskFileItemFactory FileItem 对象的工厂,可以设定缓冲区大小和存放临时文件目录。
ServletFileUpload 处理上传的文件的数据,优先保存在缓冲区,如果数据超过了缓冲区大小,则保存到硬盘上,存储在DiskFileItemFactory指定目录下的临时文件。数据都接收完后,它再在从临时文件中将数据写入到上传文件目录下的指定文件中,并删除临时文件。
4:几个小功能
限制上传文件的大小
long MAXSIZE=1024*1024*3; 单位是byte,所以这里指定的是3M
upload.setFileSizeMax(MAXSIZE);
设定临时目录
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*1024); 设定了1M的缓冲区
factory.setRepository(new File("E:/temp")); 设置上传文件的临时目录
如果上传的文件小于1M,那么文件就在缓冲区中,然后写入硬盘,不经过缓冲区。这样也就不用硬盘的读写了,应该比较快。
定义服务器能接受的文件类型。
String[] allowTypes = new String[]{"jpg","jpeg"};
用数组定义可接受文件的后缀名,在读取表单内容后,取得客户端上传文件的全名,再截取后缀名,取到最后一个.的下标,再拿到之后所有的字符串:
String endName= fileName.substring(fileName.lastIndexOf(".")+1);
用数组遍历,如果不在数组中有定义,那么就不接受。
throw new RuntimeException("文件类型["+endName+"],不支持");
最基本的代码实现:
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = upload.parseRequest(request); //解析request请求
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) { //如果是表单域 ,就是非文件上传元素
String name = item.getFieldName(); //获取name属性的值
String value = item.getString(); //获取value属性的值
} else {
String fieldName = item.getFieldName(); //文件域中name属性的值
String fileName = item.getName(); //文件的全路径,绝对路径名加文件名
String contentType = item.getContentType(); //文件的类型
long size = item.getSize(); //文件的大小,以字节为单位
File saveFile = new File("D:/test.jpg"); //定义一个file指向一个具体的文件
item.write(saveFile); //把上传的内容写到一个文件中
}
common-fileupload组件
下载地址:http://jakarta.apache.org/commons/fileupload/
下载后解压zip包,将commons-fileupload-1.0.jar复制到tomcat的webapps\你的webapp\WEB-INF\lib\下
Create a servlet
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
public class Upload extends HttpServlet {
private String uploadPath = "C:\\upload\\"; // 用于存放上传文件的目录
private String tempPath = "C:\\upload\\tmp\\"; // 用于存放临时文件的目录
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
try {
DiskFileUpload fu = new DiskFileUpload();
// 设置最大文件尺寸,这里是4MB
fu.setSizeMax(4194304);
// 设置缓冲区大小,这里是4kb
fu.setSizeThreshold(4096);
// 设置临时目录:
fu.setRepositoryPath(tempPath);
// 得到所有的文件:
List fileItems = fu.parseRequest(request);
Iterator i = fileItems.iterator();
// 依次处理每一个文件:
while(i.hasNext()) {
FileItem fi = (FileItem)i.next();
// 获得文件名,这个文件名包括路径:
String fileName = fi.getName();
if(fileName!=null) {
// 在这里可以记录用户和文件信息
// ...
// 写入文件a.txt,你也可以从fileName中提取文件名:
fi.write(new File(uploadPath + "a.txt"));
}
}
// 跳转到上传成功提示页面
}
catch(Exception e) {
// 可以跳转出错页面
}
}
}
//当servlet收到浏览器发出的Post请求后,在doPost()方法中实现文件上传。以下是示例代码:
如果要在配置文件中读取指定的上传文件夹,可以在init()方法中执行:
public void init() throws ServletException {
uploadPath = ....
tempPath = ....
// 文件夹不存在就自动创建:
if(!new File(uploadPath).isDirectory())
new File(uploadPath).mkdirs();
if(!new File(tempPath).isDirectory())
new File(tempPath).mkdirs();
}
配置servlet,用记事本打开tomcat\webapps\你的webapp\WEB-INF\web.xml源码天空,没有的话新建一个。典型配置如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>Upload</servlet-name>
<servlet-class>Upload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Upload</servlet-name>
<url-pattern>/fileupload</url-pattern>
</servlet-mapping>
</web-app>
配置好servlet后,启动tomcat,写一个简单的html测试:
<form action="fileupload" method="post" enctype="multipart/form-data" name="form1">
<input type="file" name="file">
<input type="submit" name="Submit" value="upload">
</form>
注意action="fileupload"其中fileupload是配置servlet时指定的url-pattern。
相关推荐
本文将详细介绍`DiskFileItemFactory`和`FileInputStream`在文件上传过程中的应用。 `DiskFileItemFactory`是FileUpload组件的核心工厂类,它负责创建`DiskFileItem`对象。`DiskFileItem`是一个实现了`FileItem`...
- ` DiskFileItemFactory `:用于创建`FileItem`对象,它代表了上传的单个文件或普通表单字段。如果内存不足以存储所有数据,它会将数据写入磁盘。 - `ServletFileUpload`:解析Servlet的`HttpServletRequest`,...
在上面的代码中,Servlet监听"/upload"路径,当接收到文件上传请求时,使用`ServletFileUpload`解析请求,并将每个文件项写入到指定的服务器目录("uploads/")。 文件下载部分则相对简单。Servlet可以提供一个链接...
本实例将详细介绍如何利用JSP和Servlet来实现文件的上传与下载功能。 首先,我们需要了解JSP和Servlet的基本概念。JSP是一种服务器端脚本语言,它允许开发者在HTML页面中嵌入Java代码,使得动态内容的生成更加直观...
"servlet文件上传(含图片缩放功能)"的示例是利用Servlet实现用户上传图片,并且具备根据用户需求对上传图片进行缩放的功能。这个功能在很多网站如社交媒体、博客平台等非常常见,以便用户能够优化他们的图片大小,...
1. **MultipartRequest**: 在Servlet中处理文件上传,我们通常会用到` jakarta.servlet.http.multipart.MultipartRequest`(在Servlet 3.0及以上版本)或`org.apache.commons.fileupload.servlet.ServletFileUpload`...
本教程将详细讲解如何使用`JSP`和`Servlet`来实现文件上传功能,这对于创建例如图片分享网站、文档存储服务等应用至关重要。 1. **文件上传原理** 文件上传是Web应用中用户向服务器提交文件的过程。在HTTP协议中,...
Java Servlet和SWFUpload是两种不同的技术,但它们在处理大文件上传方面有着共同的应用。在Web开发中,用户可能需要上传大文件,如视频、音频或大型文档,这就需要服务器端具有处理大文件上传的能力。Java Servlet是...
在Servlet中实现文件上传功能,通常会借助第三方库,如Apache Commons FileUpload。本文将详细介绍如何使用Servlet和Apache Commons FileUpload来实现文件上传。 首先,我们需要引入Apache Commons FileUpload和...
Java Servlet 文件上传是Web开发中的一个关键功能,它允许用户通过HTTP协议将本地文件传输到服务器。在Java中,我们通常使用Servlet API和第三方库如Apache Commons FileUpload来实现这一过程。Apache Commons ...
3. 在Servlet中,我们先创建一个临时文件夹以保存上传过程中产生的临时文件,然后实例化`DiskFileItemFactory`和`ServletFileUpload`对象。设置`sizeThreshold`参数,当输入流达到这个大小时,数据将被写入磁盘。...
下面将详细解释如何使用Servlet实现文件上传和下载的功能。 ### 文件上传 文件上传主要涉及以下步骤: 1. **创建HTML表单**:首先,我们需要一个HTML表单让用户选择要上传的文件。表单应包含`enctype="multipart/...
Servlet文件上传是Web开发中常见的需求,特别是在处理用户提交的表单时,比如上传图片、文档等。在Java中,Servlet API本身并没有提供直接处理文件上传的机制,但可以通过第三方库来实现,如Apache Commons ...
在处理文件上传需求时,JSP通常作为前端界面,而Servlet则负责后端逻辑处理。本篇文章将深入探讨如何使用JSP与Servlet进行文件上传,并特别关注如何解决中文文件名乱码的问题。 首先,我们需要理解文件上传的基本...
### 使用JSP与Servlet实现文件上传的深度解析 在当今的网络应用开发中,文件上传功能已成为不可或缺的一部分,尤其在电子商务、社交平台、多媒体分享等领域。本文将深入探讨如何运用JSP(JavaServer Pages)与...
DiskFileItemFactory通过内部的磁盘存储机制来创建FileItem实例,使得文件上传时可以暂时存储在服务器的磁盘上,而不是全部载入内存,这对于上传大文件特别有用。 #### 实现文件上传的步骤如下: 1. 创建...
在提供的压缩包文件`servletupLoadFile`中,可能包含了实现上述步骤的完整Servlet代码和相关的配置文件,你可以参考这些文件来理解和学习文件上传的实现。记得根据你的实际需求对代码进行调整和优化。
本教程将专注于使用Java、JSP(JavaServer Pages)和Servlet来实现文件上传,并结合Apache Commons IO和Commons FileUpload库来简化这个过程。这两个库提供了方便的API,使文件上传更加简单、高效。 首先,我们需要...
* 4)高水平的API文件上传处理 ServletFileUpload upload = new ServletFileUpload(factory); * 目的是调用 parseRequest(request)方法 获得 FileItem 集合list , * * 5)在 FileItem 对象中 获取信息, ...
本文将详细介绍如何使用Servlet实现文件上传功能,包括支持多文件上传。关键知识点包括Servlet接口、Multipart解析器、文件处理和常见配置。 首先,为了实现文件上传,我们需要依赖Apache Commons FileUpload库,它...