<form
name=
"form"
action=
"/struts/UploadServlet"
method=
"post"
enctype=
"multipart/form-data"
>
username:
<input
type=
"text"
name=
"username"
/><br>
password:
<input
type=
"password"
name=
"password"
/><br>
file1:
<input
type=
"file"
name=
"file1"
/><br>
file2:
<input
type=
"file"
name=
"file2"
/><br>
<input
type=
"submit"
name=
"submit"
value=
" submit "
/>
</form>
注意:文件上传中,form的method一定要设为"
post
"方法。另外enctype的属性值应该为“
multipart/form-data
”,默认的为"
application/x-www-form-urlencoded
"
后台servlet处理:UploadServlet.java
package
com
.
servlet;
import
java.io.File;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.OutputStream;
import
java.util.List;
import
javax.servlet.ServletException;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.apache.commons.fileupload.FileItem;
import
org.apache.commons.fileupload.disk.DiskFileItemFactory;
import
org.apache.commons.fileupload.servlet.ServletFileUpload;
public
class
UploadServlet
extends
HttpServlet
{
@SuppressWarnings(
"unchecked")
public
void
doPost(
HttpServletRequest
request
,
HttpServletResponse
response)
throws
ServletException
,
IOException
{
DiskFileItemFactory
factory
=
new
DiskFileItemFactory();
factory.setSizeThreshold(2 * 1024 * 1024);
factory.setRepository(tempPath);
String
path
=
request
.
getRealPath
(
"/upload"
); //存储文件的临时的路径
factory
.
setRepository
(
new
File
(
path
));
//设置上传工厂的限制
factory
.
setSizeThreshold
(
1024
*
1024
);//上传限制 默认的是10K
//设置一个上传的ServletFileUPload对象
ServletFileUpload
upload
=
new
ServletFileUpload
(
factory
);
try
{
//处理HTTP请求,item是所有的表单项
List
<
FileItem
>
list
=
upload
.
parseRequest
(
request
);
//遍历所有的表单项
for
(
FileItem
item
:
list
)
{
if
(
item
.
isFormField
())
{ //上传的类型分为表单域和非表单域
String
name
=
item
.
getFieldName
();
System
.
out
.
println
(
"----name="
+
name
);
String
value
=
item
.
getString
(
"gbk"
);
request
.
setAttribute
(
name
,
value
);
}
else
{
FileOutputStream fos = null;
String path = this.getServletContext().getRealPath(
"/image");
if (item.isInMemory()) { //在内存中 //此处有个简单的写文件的方法 write()
byte[] buff = item.get();
String fileNameStr = item.getName();
int position = fileNameStr.lastIndexOf("\");
String fileName = fileNameStr
.substring(position + 1);
photourl = fileName;
fos = new FileOutputStream(path + "\" + fileName);
fos.write(buff);
fos.close();
} else {//不在内存中
byte[] buff = new byte[4 * 1024];
InputStream is = item.getInputStream();
int size = 0;
String fileNameStr = item.getName();
int position = fileNameStr.lastIndexOf("\");
String fileName = fileNameStr.substring(position);
photourl = fileName;
fos = new FileOutputStream(path + "\" + fileName);
while ((size = is.read(buff)) != -1) {
fos.write(buff, 0, size);
}
fos.close();
is.close();
}
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
request
.
getRequestDispatcher
(
"upload/result.jsp"
).
forward
(
request
,
response
);
}
}
在此解释一下commons-fileupload组件中几个方法的含义:
表单域分成两种,一种是文件域,一种是非文件域。common-fileupload框架都把它们当成FileItem对象处理,如果该对象的isFromField()方法返回true,表明该表单域是一个非文件域,否则是一个文件域。
FileItem类包含如下几个方法:
getFieldName()
:取得该表单域的name属性值
getString(String encoding)
:取得该表单域的value属性值,其中encoding参数设置该表单域的编码集。
getName()
:仅当该表单域是文件域时,该方法才有效,该方法返回上传文件的文件名
fileupload中的
DiskFileItemFactory 中的 setThreshold()是设置一个阀值 默认为10k 在阀值以内的文件的大小被保存在内存中 超过了阀值的就被保存在硬盘上的临时的目录中 ,就是setRepository()的目录中。
清除临时的文件的办法;一下是文档说明:
This section applies only, if you are using the DiskFileItem. In other words, it applies, if your uploaded files are written to temporary files before processing them.
Such temporary files are deleted automatically, if they are no longer used (more precisely, if the corresponding instance of java.io.File
is garbage collected. This is done silently by the org.apache.commons.io.FileCleaner
class, which starts a reaper thread.
This reaper thread should be stopped, if it is no longer needed. In a servlet environment, this is done by using a special servlet context listener, calledFileCleanerCleanup. To do so, add a section like the following to your web.xml
:
<web-app>
...
<listener>
<listener-class>
org.apache.commons.fileupload.servlet.FileCleanerCleanup
</listener-class>
</listener>
...
</web-app>
感觉他写的内容少了点,我补上了些。