以下是使用JSP组件commons-fileupload实现文件上传的详细攻略:
环境准备
首先需要在项目中引入commons-fileupload组件,可以在Maven中添加以下依赖:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
在JSP页面中需要引入以下标签库:
<%@ taglib uri="http://commons.apache.org/fileupload" prefix="fileupload" %>
文件上传表单
在JSP页面中需要编写一个文件上传的表单,可以通过HTML代码实现:
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit" value="Upload"/>
</form>
需要设置表单的enctype
属性为multipart/form-data
,才能支持文件上传。
文件上传处理
在JSP页面的<body>
标签中添加以下代码:
<%
// 指定上传文件的保存目录
String savePath = "D:/upload";
File file = new File(savePath);
if (!file.exists() && !file.isDirectory()) {
System.out.println("创建目录:" + savePath);
file.mkdirs();
}
// 解析器解析request的上下文
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传文件的大小限制为100MB
upload.setFileSizeMax(100 * 1024 * 1024);
// 设置上传文件的头信息的字符编码
upload.setHeaderEncoding("UTF-8");
// 转换request对象,但是这里不能用HttpServletRequest request = (HttpServletRequest) req;
// 因为我们还需要对请求进行扩展,使用ServletRequest的包装类
ServletRequest requestWrapper = new RequestWrapper(request);
// 解析请求,得到文件项集合
List<FileItem> fileItems = upload.parseRequest(requestWrapper);
// 遍历文件项集合
for (FileItem fileItem : fileItems) {
// 如果是普通表单字段
if (fileItem.isFormField()) {
String fieldName = fileItem.getFieldName();
String fieldValue = fileItem.getString("UTF-8");
System.out.println("普通表单字段:" + fieldName + " = " + fieldValue);
} else {
// 获取上传的文件名称
String fileName = fileItem.getName();
System.out.println("上传的文件名:" + fileName);
// 保存文件
if (fileName != null && !"".equals(fileName.trim())) {
fileItem.write(new File(savePath, fileName));
System.out.println("文件保存成功!");
}
}
}
%>
首先,设置上传文件的保存目录,这里默认保存路径为“D:/upload”,使用时请根据自己的需要修改路径。
然后,创建一个DiskFileItemFactory
对象和一个ServletFileUpload
对象。
接下来需要创建一个RequestWrapper
对象,用于对请求进行扩展。由于在JSP页面中无法直接重写HttpServletRequest
对象的方法,因此需要自定义一个RequestWrapper
类,继承HttpServletRequestWrapper
类:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class RequestWrapper extends HttpServletRequestWrapper {
private Map<String, String[]> params = new HashMap<>();
public RequestWrapper(HttpServletRequest request) throws IOException {
super(request);
InputStream in = request.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
sb.append(line);
}
String[] paramStrs = sb.toString().split("&");
for (String paramStr : paramStrs) {
String[] kv = paramStr.split("=");
if (kv.length == 2) {
String key = kv[0];
String value = kv[1];
if (params.containsKey(key)) {
String[] oldValues = params.get(key);
List<String> list = new ArrayList<>();
Collections.addAll(list, oldValues);
list.add(value);
params.put(key, list.toArray(new String[list.size()]));
} else {
params.put(key, new String[]{value});
}
}
}
}
@Override
public String getParameter(String name) {
String[] values = params.get(name);
if (values != null && values.length > 0) {
return values[0];
}
return null;
}
@Override
public Enumeration<String> getParameterNames() {
Set<String> keys = params.keySet();
Iterator<String> it = keys.iterator();
List<String> list = new ArrayList<>();
while (it.hasNext()) {
list.add(it.next());
}
Enumeration<String> en = Collections.enumeration(list);
return en;
}
@Override
public String[] getParameterValues(String name) {
return params.get(name);
}
@Override
public Map<String, String[]> getParameterMap() {
return params;
}
}
在RequestWrapper
类中,重写了getParameter()
、getParameterNames()
、getParameterValues()
和getParameterMap()
四个方法,用于获取表单提交的参数。
最后,解析出上传的文件,进行保存。
示例一
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="java.io.*" %>
<%@ taglib uri="http://commons.apache.org/fileupload" prefix="fileupload" %>
<html>
<head>
<title>文件上传示例</title>
</head>
<body>
<h1>文件上传示例</h1>
<%
// 指定上传文件的保存目录
String savePath = "D:/upload";
File file = new File(savePath);
if (!file.exists() && !file.isDirectory()) {
System.out.println("创建目录:" + savePath);
file.mkdirs();
}
// 解析器解析request的上下文
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传文件的大小限制为100MB
upload.setFileSizeMax(100 * 1024 * 1024);
// 设置上传文件的头信息的字符编码
upload.setHeaderEncoding("UTF-8");
// 转换request对象,但是这里不能用HttpServletRequest request = (HttpServletRequest) req;
// 因为我们还需要对请求进行扩展,使用ServletRequest的包装类
ServletRequest requestWrapper = new RequestWrapper(request);
// 解析请求,得到文件项集合
List<FileItem> fileItems = upload.parseRequest(requestWrapper);
// 遍历文件项集合
out.println("<ul>");
for (FileItem fileItem : fileItems) {
// 如果是普通表单字段
if (fileItem.isFormField()) {
String fieldName = fileItem.getFieldName();
String fieldValue = fileItem.getString("UTF-8");
out.println("<li>" + fieldName + " = " + fieldValue + "</li>");
} else {
// 获取上传的文件名称
String fileName = fileItem.getName();
out.println("<li>上传的文件名:" + fileName + "</li>");
// 保存文件
if (fileName != null && !"".equals(fileName.trim())) {
fileItem.write(new File(savePath, fileName));
out.println("<li>文件保存成功!</li>");
}
}
}
out.println("</ul>");
%>
</body>
</html>
在这个示例中,简单展示了一个文件上传的页面,使用了<fileupload:file>
标签库实现。
示例二
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="java.io.*" %>
<%@ taglib uri="http://commons.apache.org/fileupload" prefix="fileupload" %>
<html>
<head>
<title>文件上传示例</title>
</head>
<body>
<h1>文件上传示例</h1>
<form action="upload" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>文件:</td>
<td><input type="file" name="file"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="上传"/></td>
</tr>
</table>
</form>
<%
// 指定上传文件的保存目录
String savePath = "D:/upload";
File file = new File(savePath);
if (!file.exists() && !file.isDirectory()) {
System.out.println("创建目录:" + savePath);
file.mkdirs();
}
// 解析器解析request的上下文
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传文件的大小限制为100MB
upload.setFileSizeMax(100 * 1024 * 1024);
// 设置上传文件的头信息的字符编码
upload.setHeaderEncoding("UTF-8");
// 转换request对象,但是这里不能用HttpServletRequest request = (HttpServletRequest) req;
// 因为我们还需要对请求进行扩展,使用ServletRequest的包装类
ServletRequest requestWrapper = new RequestWrapper(request);
// 解析请求,得到文件项集合
List<FileItem> fileItems = upload.parseRequest(requestWrapper);
// 遍历文件项集合
out.println("<ul>");
for (FileItem fileItem : fileItems) {
// 如果是普通表单字段
if (fileItem.isFormField()) {
String fieldName = fileItem.getFieldName();
String fieldValue = fileItem.getString("UTF-8");
out.println("<li>" + fieldName + " = " + fieldValue + "</li>");
} else {
// 获取上传的文件名称
String fileName = fileItem.getName();
out.println("<li>上传的文件名:" + fileName + "</li>");
// 保存文件
if (fileName != null && !"".equals(fileName.trim())) {
fileItem.write(new File(savePath, fileName));
out.println("<li>文件保存成功!</li>");
}
}
}
out.println("</ul>");
%>
</body>
</html>
这个示例中,使用HTML代码实现了一个文件上传的表单,通过<input type="file">
标签支持文件上传。
以上就是使用JSP组件commons-fileupload实现文件上传的完整攻略,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP组件commons-fileupload实现文件上传 - Python技术站