JSP上传文件

客户端


html form表单:

表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.

HTML代码

<form name="myform" action="MyJsp.jsp"
method="post"

enctype="multipart/form-data">

File1:<br>

<input
type="file" name="myfile"><br>

File2:<br>

<input
type="file" name="myfile"><br>

<br>

<input
type="submit" name="submit" value="Commit">

</form>

服务器端


Apache的commons-fileupload.jar可方便的实现文件的上传功能,本例子通过导入这个commons-fileupload.jar。将Apache的commons-fileupload.jar放在应用程序的WEB-INF\lib下。

FileUpload 是基于 Commons IO的,所以在进入项目前先确定Commons IO的jar包在WEB-INF\lib下。

主要使用的如下:

FileItem-------DiskFileItemFactory-----ServletFileUpload

作用:

FileItem 用来封装表单中的元素和数据。

ServletFileUpload 处理表单数据,将数据封装到 FileItem 对象中。

DiskFileItemFactory FileItem 对象的工厂,可以设定缓冲区大小和存放临时文件目录。

ServletFileUpload
处理上传的文件的数据,优先保存在缓冲区,如果数据超过了缓冲区大小,则保存到硬盘上,存储在DiskFileItemFactory指定目录下的临时文件。数据都接收完后,它再在从临时文件中将数据写入到上传文件目录下的指定文件中,并删除临时文件。

功能:

限制上传文件的大小

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);
//把上传的内容写到一个文件中
}

MyJsp.jsp代码

File uploadPath = new
File("D:\\temp");//上传文件目录

if
(!uploadPath.exists()) {

uploadPath.mkdirs();

}

// String
uploadPath="D:\\temp";

boolean
isMultipart = ServletFileUpload.isMultipartContent(request);

if (isMultipart
== true) {

try {

FileItemFactory factory = newDiskFileItemFactory();

ServletFileUpload upload = newServletFileUpload(factory);

List<FileItem> items = upload.parseRequest(request);//得到所有的文件

Iterator<FileItem> itr = items.iterator();

while (itr.hasNext()) {//依次处理每个文件

FileItem item = (FileItem) itr.next();

String fileName =
item.getName();//获得文件名,包括路径

if (fileName != null) {

File fullFile = newFile(item.getName());

File savedFile = newFile(uploadPath,

fullFile.getName());

item.write(savedFile);

}

}

out.print("upload succeed");

}
catch(Exception e) {

e.printStackTrace();

}

}else{

out.println("the enctype must be multipart/form-data");

}

时间: 2024-07-30 16:49:14

JSP上传文件的相关文章

复习struts2+jsp上传文件

有个form <form action="upload" id="upForm" method="post">     <input type="file" id="att" name="attachment" accept="img/jpeg">     <input type="submit" value=&quo

jsp上传文件,form表单提交数据enctype="multipart/form-data"时servlet获取不到type=“text”的数据问题

在上传文件用了commons fileupload组件的情况下,servlet接收的数据只能是type=file表单元素类型,那么获取type=text类型,就可以使用parseRequest(request)来获取list,fileitem,判断isFormField,为true非file类型的.就可以处理了.下面是处理的部分代码: DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold

jsp 上传文件代码

【转】JSP使用上传文件,并生产高清缩略图示例

原文地址:http://blog.csdn.net/yakson/article/details/9875731 前言 刚开始本来只想来测试一下Thumbnails生成缩略图的效果的,顺便来学一下jsp文件,开始没有使用commons-fileupload上 传组件,自己用纯jsp代码来编写,过程相当曲折.所以就不建议大家去编写纯JSP的上传代码了,想写的可以参考下commons-fileupload 的源码,里面很详细. 一.JSP上传文件 大家都知道,上传文件是以二进制上传的,这样可以让文件

JSP/Serlet 使用fileupload上传文件

需要引用的jar commons-fileupload-1.3.1.jar commons-io-2.2.jar index.jsp <body> <center> <h3>文件上传</h3> <font color="red"><%=request.getAttribute("msg")==null?"":request.getAttribute("msg")

JSP简单练习-上传文件

注意:在编写上传文件的代码时,需确保"WEB-INF/lib"下含有jspsmartupload.jar包,否则会出错. jspSmartupload.jar下载 <!-- uploadfileform.jsp --> <%@ page language="java" contentType="text/html; charset=gb2312" %> <html> <head> <title

springMVC+jsp+ajax上传文件

工作中遇到的小问题,做个笔记 实现springMVC + jsp + ajax 上传文件 HTML <body> <form id="myform" method="post" > 登录名<input type="text" name="loginName" /> <br> 上传录音<input type="file" name="record

JSP页面/Apache FileUpload组件上传文件的同时,传递其他参数的方法

Spring3.0+Apache Tomcatv7.0+JDK1.7.0_u45+J2EE1.4验证通过. 需求:使用JSP页面上传文件时,同时需要传递相关参数. 1.  需要将form设置为enctype="multipart/form-data"method="post"参数: 2.  由于此时URL参数不能通过request.getParameter()获得,所以为了让@RequestMapping中设置的params="command=upload

JSP通过SmartUpload上传文件实例

httpRequest.setCharacterEncoding("gbk"); String preName = genName.doMake();//设置文件前缀名 String extName = null; String allName = null; String fileName = null; try { //初始化 sUpload.initialize(servletConfig, request, response); //设置文件最大上传为10M sUpload.s