一、文件上传入门
1. 应用:
用户上传头像、上传图片、邮件上传附件等
2. 页面表单的实现
文件上传表单和普通表单有两个区别
1) 需要文件上传字段 <input type=”file” />
2) form 表单的 enctype 属性需要指定为 multipart/form-data
3. 服务器端解析request
在 Servlet 中通过 request.getInputStream 获得表单上传数据,会发现数据是分段发送的
由于自己写程序解析有难度,我们可以使用Apache 开发的开源组件Commons-fileupload
需要导入 jar 包Commons-fileupload 和Commons-io
4 . UploadServlet 中处理文件上传程序
// 1. 创建工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2. 创建FileUpload对象
ServletFileUpload upload = new ServletFileUpload(factory);
// 3. 判断是否是上传表单
boolean b = upload.isMultipartContent(request);
if(!b) {
// 不是文件上传
request.setAttribute("message", "对不起,不是文件上传表单!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
// 是文件上传表单
// 4. 解析request,获得FileItem项
List<FileItem> fileitems = upload.parseRequest(request);
// 5. 遍历集合
for(FileItem item : fileitems) {
// 判断是不是普通字段
if(item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
// 手工的转换了
value = new String(value.getBytes("iso-8859-1"),"utf-8");
System.out.println(name + "=" + value);
} else {
// 文件上传字段
// 获得文件名
String filename = item.getName();
System.out.println(filename);
filename = filename.substring(filename.lastIndexOf("\\")+1);
System.out.println(filename);
// 创建文件
ServletContext context = getServletContext();
String dir = context.getRealPath("WEN-INF/upload");
File file = new File(dir, filename);
file.createNewFile();
// 获得流,读取数据写入文件
InputStream in = item.getInputStream();
FileOutputStream fos = new FileOutputStream(file);
int len;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0)
fos.write(buffer,0,len);
fos.close();
in.close();
item.delete(); // 删除临时文件
}
二、 文件上传处理细节
1. 中文乱码问题
1) 文件名中文乱码问题,解决办法: 告诉文件上传组件以什么编码方式来解码文件名
ServletUpload.setCharacterEncoding(“utf-8”);
request. setCharacterEncoding(“utf-8”);
2) 普通字段中文乱码问题
fileitem.getString(“utf-8”);
2. 临时文件
对于大文件不能缓存在内存,需要缓存到硬盘,为了方便管理,我们需要设置临时文件存放目录
// 设置临时文件的存放位置
factory.setRepository(new File("d:/temp"));
文件上传完毕需要删除临时文件,否则会导致服务器存在两份上传文件
// 注意,需要先将流进行关闭,否则会导致临时文件无法删除
out.close();
in.close();
// 删除临时文件
fileitem.delete();
3. 文件存放目录
1) 目录需要隐藏,禁止外界直接访问
2) 文件名需要保证不重复
3) 文件应该分目录存放
三、上传进度条
1. 实现进度监听
需要实现对文件上传进度的监听,需要给FileUpload 对象添加 ProgressListener
在upload方法中对与进度相关的数据进行处理
upload.setProgressListener(new ProgressListener() {
long num = 0;
public void update(long bytesRead, long contentLength, int items) {
long progress = bytesRead*100/contentLength;
if(progress==num)
return;
num = progress;
System.out.println("上传进度:" + progress + "%");
// request.getSession().setAttribute("progress", progress);
}
});
2. 在 jsp 页面显示进度
实验:
1) 使用 iframe 发送请求, 请求一个Servlet, 在Servlet 中返回响应,发送自增的num
此时会发现 iframe 会不停第想Servlet发送请求
2) 点击文件上传按钮后,iframe立刻停止刷新,直至上传完毕页面跳转至新页面
3)为了观察实验结果,将form 的 target 指定为 iframe, UploadServlet回送上传完毕的结果
4) 出现上述问题的原因,浏览器不支持多线程同时访问服务器只能同时发送一个请求,
这样的访问方式为同步访问
5) 要在文件上传的同时在iframe中实现进度访问,就需要ie浏览器与服务器进行异步交互
此时就需要 XMLHttpRequest 对象
在javascript中可以直接使用XMLHttpRequest 对象与服务器进行异步通信
获得XmlHttpRequest 对象的方式有两种
ie7以上版本
var xhr = null;
if(window.XMLHttpRequest)
xhr = new XMLHttpRequest();
ie7以下版本
if(window.ActiveXObject)
xhr = new ActiveXObject(“Microsoft.XMLHTTP”);
获得对象后需要调用open方法输入请求地址
注意请求方式, 地址的输入, 并且需要设置为true 指定异步访问该地址
xhr.open(“get”,”/upload/servlet/UploadServlet”, false)
// 调用send 方法发送请求,post方式需要发送消息体,get方式则不用直接传入null值
xhr.send(null);
// 访问 responseText 属性获得 Servlet 回送的数据
document.write(xhr.responseText);
四、 api方法
1. DiskFileItemFactory 对象
设置缓冲区大小,字节为单位,默认为10K,一般不用修改
factory.setSizeThreshold(1000);
设置临时文件存放目录
factory.setRepository(file);
2. ServletFileUpload 对象
判断是否为文件上传表单
boolean b = upload.isMultipartContent(request);
解析request对象
List<FileItem> list = upload.parseRequest(request);
设置上传文件的最大值
setFileSizeMax(long fileSizeMax)
设置上传文件总量的最大值
setSizeMax(long sizeMax)
设置编码格式
setHeaderEncoding(java.lang.String encoding)
注册进度监听器
setProgressListener(ProgressListener pListener)
3. FileItem 对象
获得表单字段的属性名
item.getFieldName();
获得普通字段的值
item.getString(charsetName)
获得文件上传字段的文件名
item.getName()
获得文件上传的流
item.getInputStream()
分享到:
相关推荐
在这个"Servlet 文件上传下载例子"中,我们将探讨如何使用Servlet实现文件的上传和下载功能,这对于构建一个简单的图片文件服务器至关重要。 1. **文件上传** - **MultipartRequest**: 在Servlet中,处理文件上传...
jsp、servlet 文件上传下载技术详解 文件上传下载是 Web 应用中的一种常见需求,使用 jsp 页面和 servlet 实现文件上传下载是其中的一种解决方案。下面将详细介绍 jsp、servlet 文件上传下载技术。 文件上传下载...
在Java Web开发中,JSP(Java...总的来说,JSP+Servlet实现文件上传下载涉及到HTML表单、Servlet请求处理、文件I/O以及第三方库的使用。通过这个实例,开发者可以掌握在Java Web环境中处理文件上传下载的基本流程。
下面将详细解释如何使用Servlet实现文件上传和下载的功能。 ### 文件上传 文件上传主要涉及以下步骤: 1. **创建HTML表单**:首先,我们需要一个HTML表单让用户选择要上传的文件。表单应包含`enctype="multipart/...
`SmartUpload`组件为Java Web开发者提供了高效、易用的文件上传下载解决方案,降低了开发复杂度,提高了开发效率。在使用过程中,结合良好的代码规范和安全策略,可以构建出稳定且功能完善的文件管理功能。
### Servlet实现文件上传与下载 #### 一、概述 在Web开发中,文件的上传与下载是一项非常常见的功能需求。本文将详细介绍如何使用Java Servlet技术实现文件的上传和下载功能。我们将通过一个简单的示例来展示整个...
以上就是使用JSP和Servlet实现文件上传下载的基本流程和关键代码。在实际应用中,我们还需要考虑错误处理、安全性(如防止文件覆盖、上传恶意文件等)以及性能优化(如使用缓冲、断点续传等)。在大型项目中,可能还...
总结来说,实现Servlet文件上传下载需要理解Servlet生命周期、HTTP请求处理、多部分数据解析以及文件I/O操作。Apache Commons FileUpload库简化了这一过程,但理解其背后的原理对于解决可能出现的问题和优化性能至关...
Servlet是Java提供的一种用于扩展服务器功能的接口,尤其在网络应用中,如文件上传和下载。本实例将深入讲解如何利用Http Servlet实现文件的上传与下载功能。 一、文件上传 1. **MultipartRequest**: 在Servlet中...
在文件上传和下载的场景中,Servlet将扮演接收请求、处理数据并发送响应的角色。 **文件上传:** 1. **表单设计**:在HTML页面上,我们需要一个表单让用户选择要上传的文件。表单需要设置`enctype="multipart/form-...
包含文件 1:ajax上传删除,支持多文件实时预览; 2:jstl标签定制, ...上传使用servlet,使用跟FCK使用一样,感谢FCK,让我借鉴。支持标签定义上传类型。 当然是跨平台,支持所有浏览器 使用超级方便。
在这个项目中,我们重点关注的是Servlet如何实现文件上传、下载和缩略图的生成。 首先,让我们深入理解文件上传的过程。在Web应用中,文件上传通常通过HTML表单实现,使用`<input type="file" />`标签让用户选择要...
com.fm.FileManagerService:一个servlet用来实现主要的文件上传下载逻辑的 com.fm.MyPreogressListener:一个进度监听类,用来做上传进度条的 jquery-1.9.1.js index.jsp:文件列表页面 upload.jsp:文件上传form...
Java Servlet和SWFUpload是两种不同的技术,但它们在处理大文件上传方面有着共同的应用。在Web开发中,用户可能需要上传大文件,如视频、音频或大型文档,这就需要服务器端具有处理大文件上传的能力。Java Servlet是...
下面将详细介绍如何使用Servlet实现文件上传和下载的功能。 ### 文件上传 文件上传通常涉及到HTTP协议中的`multipart/form-data`编码类型,这是处理表单数据中包含文件的关键。Servlet 3.0及以上版本提供了更方便...
JavaServlet文件上传和下载,java初学者笔记!
### jsp+servlet实现文件上传下载 在现代Web开发中,文件上传下载是常见的功能之一。JSP(JavaServer Pages)与Servlet技术结合可以轻松实现这一功能。本篇将详细介绍如何利用jspSmartUpload组件实现文件的上传与...
总结起来,Servlet中的文件上传和下载涉及到HTTP多部分请求、文件流操作、响应头设置等多个方面。通过JSP和Javabean,我们可以更方便地在页面上与用户交互,同时封装和管理业务逻辑。理解并熟练掌握这些技术,对于...
在IT行业中,文件上传下载是Web应用中常见的功能,尤其在服务器端编程中,Servlet扮演着重要的角色。Servlet是Java编程语言中用于扩展服务器功能的接口,它可以在接收到HTTP请求后进行处理,并向客户端返回响应。在...
总之,这两个库的结合使用极大地简化了Servlet中文件上传和下载的复杂性,让开发者可以更专注于业务逻辑,而不是底层的I/O操作。在实际开发中,务必注意安全性和性能优化,例如限制文件大小、防止路径遍历攻击等。...