目录:
一、客户端
一、客户端 |
Web文件上传采用POST的方式。需要设置FORM表单元素的enctype属性为multipart/form-data。由于上传
的文件会比较大,因此需要设置该参数指定浏览器使用二进制上传。如果不设置,enctype属性默认application/x-
www.form-urlencoded,浏览器将使用ASCII向服务器发送数据,导致发送文件失败。
表单代码如下:
<form action="upload" method="post" enctype="multipart/form-data">
<fieldset >
<legend>上传文件</legend>
<div class="line">
<div align="left" class="leftDiv">上传文件一</div>
<div align="left" class="rightDiv">
<input type="file" name="file1" class="text" />
</div>
</div>
<div class="line">
<div align="left" class="leftDiv">上传文件说明一</div>
<div align="left" class="rightDiv">
<input type="text" name="description1" class="text" />
</div>
</div>
<div class="line">
<div align="left" class="leftDiv">上传文件二</div>
<div align="left" class="rightDiv">
<input type="file" name="file2" class="text">
</div>
</div>
<div class="line">
<div align="left" class="leftDiv">上传文件说明二</div>
<div align="left" class="rightDiv">
<input type="text" name="description1" class="text" />
</div>
</div>
<div class="line">
<div align="left" class="leftDiv"></div>
<div align="left" class="rightDiv"></div>
<input type="submit" value="上传文件" class="button" />
</div>
</fieldset>
</form>
二、服务端 |
所需jar包
commons-io-1.3.2.jar
commons-fileupload-1.2.1.jar
servlet代码:
public class FileUploadServlet extends HttpServlet {
private static final long serialVersionUID = 2453046781184529949L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
File file1 = null;
File file2 = null;
String description1 = null;
String description2 = null;
// 对request进行封装
RequestContext requestContext = new ServletRequestContext(request);
// 判断表单是否是multipart类型的。这里可以直接对request进行判断,不过已经是以前的用法了
if (FileUpload.isMultipartContent(requestContext)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置文件的缓存目录
factory.setRepository(new File("d:/temp"));
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传文件大小的上限,-1表示无上限
upload.setSizeMax(100 * 1024 * 1024);
List<FileItem> items = new ArrayList<FileItem>();
try {
// 上传文件,并解析出所有的表单字段,包括普通字段和文件字段
items = upload.parseRequest(request);
} catch (FileUploadException e) {
log("发生错误:" + e.getMessage());
}
// 下面对每个字段进行处理
for (FileItem fileItem : items) {
// 普通字段
if (fileItem.isFormField()) {
if ("description1".equals(fileItem.getFieldName())) {
log("遍历到 description1 ....");
description1 = new String(
fileItem.getString()
.getBytes("ISO8859-1"), "UTF-8");
log("文件1的描述:" + description1);
} else if ("description2".equals(fileItem.getFieldName())) {
log("遍历到 description2 ....");
description2 = new String(
fileItem.getString()
.getBytes("ISO8859-1"), "UTF-8");
log("文件2的描述:" + description2);
}
}
// 文件字段
else {
if ("file1".equals(fileItem.getFieldName())) {
log("遍历到 file1 ....");
File remoteFile = new File(new String(
fileItem.getName()
.getBytes(), "UTF-8"));
log("客户端文件位置:" + remoteFile.getAbsolutePath());
// 服务端文件,放到upload文件夹下
file1 = new File(getServletContext()
.getRealPath("/upload/"
+ remoteFile.getName()));
// 创建文件夹路径
file1.getParentFile().mkdirs();
// 创建新文件
file1.createNewFile();
// 将输入流中的数据输出到指定文件中
InputStream is = null;
OutputStream os = null;
try {
is = fileItem.getInputStream();
os = new FileOutputStream(file1);
byte[] buffer = new byte[1024];
int len = 0; // 实际缓存长度
while ((len = is.read(buffer)) != -1) { // 循环读入缓存
os.write(buffer, 0, len);
}
log("--------已保存文件,路径为:" + file1.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null)
is.close();
if (os != null)
os.close();
}
} else if ("file2".equals(fileItem.getFieldName())) {
log("遍历到 file2 ....");
File remoteFile = new File(new String(
fileItem.getName()
.getBytes(), "utf-8"));
log("客户端文件位置:" + remoteFile.getAbsolutePath());
// 服务端文件,放到upload文件夹下
file2 = new File(getServletContext()
.getRealPath("upload")
+ remoteFile.getName());
// 创建文件夹路径
file2.getParentFile().mkdirs();
// 创建新文件
file2.createNewFile();
// 将输入流中的数据输出到指定文件中
InputStream is = null;
OutputStream os = null;
try {
is = fileItem.getInputStream();
os = new FileOutputStream(file2);
byte[] buffer = new byte[1024];
int len = 0; // 实际缓存长度
while ((len = is.read(buffer)) != -1) { // 循环读入缓存
os.write(buffer, 0, len);
}
log("--------已保存文件,路径为:" + file2.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null)
is.close();
if (os != null)
os.close();
}
}
}
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}