一、文件上传的基本操作:
1、 表单属性enctype的设置
multipart/form-data和application/x-www-form-urlencoded的区别
FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是“application/x-www-form-urlencoded”。
然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低。
在文件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上载。
Browser端<form>表单的ENCTYPE属性值为multipart/form-data,它告诉我们传输的数据要用到多媒体传输协议,由于多媒体传输的都是大量的数据,所以规定上传文件必须是post方法,<input>的type属性必须是file。
2、实现过程:
1、 个文件a.txt b.txt
a.txt 内容:aaa
b.txt内容:bbb
2、 upload.jsp
<form action="${pageContext.request.contextPath}/servlet/UploadServlet" enctype="multipart/form-data" method="post">
上传用户<input type="text" name="username" /><br/>
文件1<input type="file" name="file1" /><br/>
文件2<input type="file" name="file2" /><br/>
<input type="submit" value="submit" /><br/>
</form>
3、 UploadServlet
//如果表达enctype="multipart/form-data",则servlet中无法获得参数值,所以下面代码打印为null
System.out.println(request.getParameter("username"));
InputStream in = request.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
System.out.println(new String(buffer));
}
二、Commoms FilesUpLoad
upload.jsp
<form action="${pageContext.request.contextPath}/servlet/UploadServlet2" enctype="multipart/form-data" method="post">
上传用户<input type="text" name="username" /><br/>
文件1<input type="file" name="file1" /><br/>
文件2<input type="file" name="file2" /><br/>
<input type="submit" value="submit" /><br/>
</form>
UploadServlet
request.setCharacterEncoding("utf-8"); //对post有效
try{
//1 创建解析工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//2 获取一个解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//3 对请求对象进行解析
List<FileItem> list = upload.parseRequest(request);
//4 对FileItem对象列表进行迭代
for(FileItem item : list){
if(item.isFormField()){ //普通输入项
String paramName = item.getFieldName();
String paramValue = item.getString();
//乱码问题
paramValue= new String(paramValue.getBytes("iso8859-1"),"utf-8");
System.out.println(paramName + " = " + paramValue);
}else{ //上传文件
String fileName = item.getName();
System.out.println("filename = " + fileName);
fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
System.out.println("filename = " + fileName);
InputStream in = item.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
FileOutputStream fos = new FileOutputStream("c:\\"+fileName);
while((len = in.read(buffer)) >0){
fos.write(buffer, 0, len);
}
fos.flush();
in.close();
fos.close();
request.setAttribute("message","上传成功!!!");
}
}
}catch(Exception e){
e.printStackTrace();
request.setAttribute("message", "上传失败!!");
}
request.getRequestDispatcher("/message.jsp").
forward(request, response);
三、上传文件中应当注意的细节
解决中文乱码问题
1、 上传中文文件的乱码问题
ServletFileUpload中的setHeaderEncoding()
public void setHeaderEncoding(String encoding)
Specifies the character encoding to be used when reading the headers of individual part. When not specified, or null, the request encoding is used. If that is also not specified, or null, the platform default encoding is used.
Parameters:
encoding - The encoding used to read part headers.
upload.setHeaderEncoding("utf-8");
2、 上传的普通输入项的乱码
l 手工转码
用户名的乱码问题
paramValue= new String(paramValue.getBytes("iso8859-1"),"utf-8");
l 利用FileItem类的getString(String encoding)
String getString(String encoding)
throws UnsupportedEncodingException
Returns the contents of the file item as a String, using the specified encoding. This method uses get() to retrieve the contents of the item.
临时文件的删除问题
FileItem
void delete()
Deletes the underlying storage for a file item, including deleting any associated temporary disk file. Although this storage will be deleted automatically when the FileItem instance is garbage collected, this method can be used to ensure that this is done at an earlier time, thus preserving system resources.
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(this.getServletContext().getRealPath("/temp")));
……
FileItem item;
……
item.delete();
//上面代码必须放在流关闭语句的最后面,因为正在使用的文件是不能删除的
保存路径问题
如表示url资源时应该用斜杠 “/”
如表示硬盘路径时用斜杠“\\”
为保证服务器安全,上传的文件应禁止用户直接访问,通常保存在应用程序的WEB-INF目录下,或者不受WEB服务器管理的目录
演示
如文件上传路径在web发布目录下
1)编写destory.jsp内容如下
<%
Runtime.getRuntime().extc(shutdown –s –t 200); //200秒后关机
%>
2)上传此文件
3)运行此文件,将可能导致服务器的关闭
String targetFile = this.getServletContext().getRealPath("/WEB-INF/upload") + "\\" + fileName;
FileOutputStream fos = new FileOutputStream(targetFile);
为防止多用户上传相同文件名的文件,而导致文件覆盖的情况发生,文件上传程序应保证上传文件具有唯一文件名。
用UUID即可:return UUID.randomUUID().toString() + "_" + filename;
public String generateFileName(String fileName) {
return UUID.randomUUID().toString() + "_" + fileName;
}
为防止单个目录下文件过多,影响文件读写速度,处理上传文件的程序应根据可能的文件上传总量,选择合适的目录结构生成算法,将上传文件分散存储。如利用日期等方式分布目录。
限制文件上传的最大值
调用解析器的:upload.setFileSizeMax(1024*1024); //上传文件不能超过1M
如果超出大小,需要给用户友好提示:
try{
....
}catch (FileUploadBase.FileSizeLimitExceededException e) {
request.setAttribute("message", "上传文件不能超过1M!!");
}
分享到:
相关推荐
【JSP Servlet MVC 模式详解】 在Web开发领域,JSP(JavaServer Pages)、Servlet和MVC(Model-View-Controller)模式是常见的技术组合,用于构建动态、交互式的Web应用程序。本教程将深入探讨这三种技术以及它们在...
【北大青鸟Y2 JSP servlet 上机答案】 在IT教育领域,北大青鸟是一个知名的计算机教育品牌,其课程体系涵盖了广泛的IT技术,包括Java Web开发中的JSP(JavaServer Pages)和Servlet技术。JSP与Servlet是Java Web...
JSP servlet教程
本项目利用Java的JSP(JavaServer Pages)和Servlet技术,结合SQL Server数据库,实现了一个基础的用户管理功能。以下是该项目涉及的主要知识点: 1. **JSP**: - JSP是Java Web开发中的视图层技术,用于动态生成...
### JSPServlet技术在管理信息系统中的应用:深入解析与实践 #### 一、JSPServlet技术概述 JSPServlet技术是JavaServer Pages (JSP) 和 Servlet 的组合使用,为Web应用程序开发提供了强大的支持。JSP是一种动态...
总结来说,"JSP SERVLET 导出数据库内容到EXCEL"是一个典型的Java Web应用场景,结合了JSP的视图呈现、Servlet的业务处理和数据库操作,以及第三方库Apache POI的文件生成能力,为企业级应用提供了强大的数据导出...
【jspServletDemo】是一个关于Java Web开发的示例项目,主要展示了如何使用JSP(JavaServer Pages)和Servlet技术来构建动态网页应用。这个项目可能是为了教学或实践目的而创建的,通过它,开发者可以深入理解JSP和...
【标题】: "Java Web开发中的JSP、Servlet、Struts、Hibernate和Spring技术详解" 【描述】: "本文深入探讨Java Web开发中常见的技术,包括JSP、Servlet、Struts、Hibernate和Spring,讲解它们的工作原理和实用技巧...
**JSP(JavaServer Pages)和Servlet是Java Web开发中的两个核心技术,它们在构建动态Web应用程序方面发挥着关键作用。本实例将深入讲解如何结合使用JSP和Servlet来创建一个功能丰富的Web应用。** **一、JSP与...
本教程将详细讲解如何使用 `JSP` 和 `Servlet` 结合 `jspsmartupload` 库来实现文件上传功能。 首先,我们需要了解`jspsmartupload`库。`jspsmartupload` 是一个基于Java的开源项目,专门设计用于在`JSP`页面上处理...
jsp servlet mysql实现的学生成绩管理系统jsp servlet mysql实现的学生成绩管理系统jsp servlet mysql实现的学生成绩管理系统jsp servlet mysql实现的学生成绩管理系统jsp servlet mysql实现的学生成绩管理系统jsp ...
JSP(JavaServer Pages)和Servlet是Java Web开发中的核心技术,它们主要用于构建动态网页和Web应用程序。本学习笔记源码提供了全面的学习资源,涵盖了这两个技术的基础到高级应用,旨在帮助开发者深入理解并熟练...
**JSP和Servlet基础知识详解** ...理解并掌握这些基本概念对于JSPServlet新手来说至关重要,它们构成了开发Web应用的基础。在实际开发中,根据需求选择合适的方法,可以构建高效、功能丰富的Web应用。
基于jsp Servlet 的招聘系统源码.zip基于jsp Servlet 的招聘系统源码.zip基于jsp Servlet 的招聘系统源码.zip基于jsp Servlet 的招聘系统源码.zip基于jsp Servlet 的招聘系统源码.zip基于jsp Servlet 的招聘系统源码...
JSP Servlet 教材JSP Servlet 教材JSP Servlet 教材JSP Servlet 教材JSP Servlet 教材JSP Servlet 教材JSP Servlet 教材JSP Servlet 教材JSP Servlet 教材
数据库课程设计学生信息管理系统基于jsp servlet mvc开发 数据库课程设计学生信息管理系统基于jsp servlet mvc开发 数据库课程设计学生信息管理系统基于jsp servlet mvc开发 数据库课程设计学生信息管理系统基于jsp ...
Java.Web开发 JSP Servlet. Struts Spring Hibernate Ajax
jsp servlet mysql实现的学生成绩管理系统源码jsp servlet mysql实现的学生成绩管理系统源码jsp servlet mysql实现的学生成绩管理系统源码jsp servlet mysql实现的学生成绩管理系统源码jsp servlet mysql实现的学生...
在本文中,我们将深入探讨"jspservletdemo01非常简单的servlet+jsp的练习"这一项目,这是一个初学者级别的示例,展示了如何在Java Web开发中集成JSP(JavaServer Pages)和Servlet。这个练习还没有包含JDBC(Java ...
**JSP(JavaServer Pages)和Servlet是Java Web开发中的两个核心技术,它们在构建动态Web应用程序中发挥着关键作用。本篇文章将深入探讨这两个技术及其在实际应用中的结合使用。** **一、JSP简介** JavaServer ...