1. jsp上传
Notice:
1. form表单 method 属性必须设置为 POST 方法 ,不能使用 GET 方法
2. form表单 enctype 属性需要设置为 multipart/form-data
3. form表单 action 属性需要设置为提交到后台处理文件上传的jsp文件地址或者servlet地址。例如 uploadFile.jsp 程序文件用来处理上传的文件
4. 上传文件元素需要使用 <input .../> 标签,属性设置为 type="file"。如果需要上传多个文件,可以在 <input .../>标签中设置不同的名称
Steps
首先我们先定义文件上传后存储在服务上的位置,你可以将路径写在你的程序当中,或者我们可以在web.xml配置文件中通过设置 context-param 元素来设置文件存储的目录
<context-param>
<param-name>file_upload_dir</param-name>
<param-value>F:\files_uploaded</param-value>
<description>Location to store uploaded files</description>
</context-param>
依赖 FileUpload, 所以你需要在你的classpath中引入最新的 commons-fileupload.x.x.jar 包文件
FileUpload 依赖 Commons IO, 所以你需要在你的classpath中引入最新的 commons-io-x.x.jar
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
在测试以下实例时,你需要上传确认上传的文件大小小于 maxFileSize 变量设置的大小 ,否则文件无法上传成功
确保你已经创建了目录F:\files_uploaded
fileupload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Up load file</title>
</head>
<body>
<form action="processFileUpload.jsp" method="post" enctype="multipart/form-data">
<input type="file" size="50" name="fileSelected">
<input type="submit" value="upload">
</form>
</body>
</html>
processFileUpload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@ page import="java.io.*,java.util.*,javax.servlet.*" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
File file;
int maxSize = 1024*1024*1024;
int maxMemSize = 1024*1024;
ServletContext ctx = pageContext.getServletContext();
String filePath = ctx.getInitParameter("file_upload_dir");
String contentType = request.getContentType();
if(ServletFileUpload.isMultipartContent(request)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(maxMemSize); //设置内存中存储文件的最大值
factory.setRepository(new File("F:\\tmp"));
ServletFileUpload servlet = new ServletFileUpload(factory);
servlet.setSizeMax(maxSize); //设置最大的上传文件大小
try {
List items = servlet.parseRequest(request);
out.println(items.size());
Iterator it = items.iterator();
while(it.hasNext()) {
FileItem item = (FileItem) it.next();
String fieldName = item.getFieldName();
String fileName = item.getName();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
if(fileName.lastIndexOf("\\") >= 0) {
file = new File(filePath, fileName.substring(fileName.lastIndexOf("\\")));
} else {
file = new File(filePath, fileName.substring(fileName.lastIndexOf("\\")+1));
}
item.write(file);
out.println("Uploaded file: " + fileName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
%>
</body>
</html>
NOTE:
代码copy自网络,起初,processFileUpload.jsp中的List items = servlet.parseRequest(request);得到的总是空集合,网上也有很多遇到这种情况的,原因 在fileupload.jsp:
name="fileSelected" , 如果没有name标记,commons fielupload不会作处理
servlet.setHeaderEncoding("UTF-8");中文名不会乱码
2. 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.ServletContext;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUploadServlet extends HttpServlet {
private static final long serialVersionUID = 849325874174997377L;
private static final int sizeThreshold = 1024*1024*1024;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println(".....doGet.....");
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletContext ctx = this.getServletContext();
String filePath = ctx.getInitParameter("file_upload_dir");
factory.setRepository(new File(filePath));
factory.setSizeThreshold(sizeThreshold);
ServletFileUpload upload = new ServletFileUpload(factory);
try {
@SuppressWarnings("unchecked")
List<FileItem> list = upload.parseRequest(req);
for(FileItem item : list) {
String name = item.getFieldName();
if(item.isFormField()) {
// String value = item.getString();
// req.setAttribute(name, value);
} else {
String value = item.getName();
String fileName = value.substring(value.indexOf("\\")+1);
req.setAttribute(name, fileName);
OutputStream os = new FileOutputStream(new File(filePath, fileName));
InputStream is = item.getInputStream();
byte[] buff = new byte[1024];
System.out.println("The length of " + value + " is " + item.getSize());
int length = 0;
while((length = is.read(buff)) != -1) {
os.write(buff, 0, length);
}
is.close();
os.close();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
req.getRequestDispatcher("pages/upload_result.jsp").forward(req, resp);
}
}
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init EncodingFilter....");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
System.out.println("set the encoding to be utf-8 in EncodingFilter...");
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("destroy EncodingFilter....");
}
}
fileupload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Up load file</title>
</head>
<body>
<form action="<%=request.getContextPath() %>/fileupload" method="post" enctype="multipart/form-data">
<input type="file" size="50" name="fileSelected">
<input type="submit" value="upload">
</form>
</body>
</html>
upload_result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>File <%=request.getAttribute("fileSelected") %> uploaded successfully.</h3>
</body>
</html>
web.xml
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>file_upload_dir</param-name>
<param-value>F:\files_uploaded</param-value>
<description>Location to store uploaded files</description>
</context-param>
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.jesse.jsp.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>fileUploadServlet</servlet-name>
<servlet-class>com.jesse.jsp.servlet.FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fileUploadServlet</servlet-name>
<url-pattern>/fileupload</url-pattern>
</servlet-mapping>
</web-app>