JSP文件上传和下载
在这个例子中,我们将学习通过 JSP 上传和下载文件。
文件输入输出是非常重要的操作。这里我们将使用 JSP 读取和写入文件。
JSP文件上传
- 我们可以使用 JSP 上传任何文件。
- 它可以是文本文件、二进制文件、图像文件或任何其他文档。
- 此处,如果是文件上传,则仅使用 POST 方法,而不使用 GET 方法。
- Enctype 属性应该设置为 multipart/form-data。
示例:使用 Action
在此示例中,我们使用 IO 对象上传文件
动作文件.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Guru File</title>
</head>
<body>
<a>Guru File Upload:</a>
Select file: <br />
<form action="action_file_upload.jsp" method="post"
enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>
动作文件上传.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import="java.io.*,java.util.*, javax.servlet.*" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.apache.commons.io.output.*" %>
<!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=ISO-8859-1">
<title>Guru File Upload</title>
</head>
<body>
<%
File file ;
int maxFileSize = 5000 * 1024;
int maxMemSize = 5000 * 1024;
String filePath = "E:/guru99/data";
String contentType = request.getContentType();
if ((contentType.indexOf("multipart/form-data") >= 0)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(maxMemSize);
factory.setRepository(new File("c:\\temp"));
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax( maxFileSize );
try{
List fileItems = upload.parseRequest(request);
Iterator i = fileItems.iterator();
out.println("<html>");
out.println("<body>");
while ( i.hasNext () )
{
FileItem fi = (FileItem)i.next();
if ( !fi.isFormField () ) {
String fieldName = fi.getFieldName();
String fileName = fi.getName();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
file = new File( filePath + "yourFileName") ;
fi.write( file ) ;
out.println("Uploaded Filename: " + filePath + fileName + "<br>");
}
}
out.println("</body>");
out.println("</html>");
}catch(Exception ex) {
System.out.println(ex);
}
}else{
out.println("<html>");
out.println("<body>");
out.println("<p>No file uploaded</p>");
out.println("</body>");
out.println("</html>");
}
%>
</body>
</html>
代码说明:
动作文件.jsp
代码行12-18: 这里我们创建带有文件字段的表单,它将文件上传到服务器,并将操作传递给 action_file_upload.jsp
动作文件上传.jsp
代码行20: 这里我们将文件路径指定为特定路径
代码行23-38: 这里我们检查内容类型是否是 multipart/form-data,如果是,则内容是文件类型,读取,读取后写入临时文件,再将临时文件转换为主文件。
执行上述代码时,将获得以下输出
输出:
我们使用选择文件按钮选项上传文件,上传文件按钮将把文件上传到服务器提供的路径。
示例:使用 JSP 操作
在此示例中,我们将使用 JSP 操作上传文件。我们将采用一个包含“上传”按钮的表单,当您单击上传按钮时,文件将被上传。
上传_1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Guru Uploading File</title>
</head>
<body>
File: <br />
<form action="guru_upload" method="post"
enctype="multipart/form-data">
<input type="file" name="guru_file" size="50" />
<br />
<input type="submit" value="Upload" />
</form>
</body>
</html>
代码说明:
代码行11-12: 这里我们采用一个对 servlet guru_upload 有操作的表单,该操作将通过方法 POST 传递。此外,这里我们 enctype 即属性,它指定表单数据应如何编码并发送到服务器,并且它仅用于 POST 方法。这里我们将其设置为 multipart/form-data,用于文件(因为数据会很大)。
代码行13: 这里我们指定类型为文件的 guru_file 元素,大小为 50。
代码行15: 这是一个名为“Upload”的提交类型按钮,通过该按钮将调用动作 servlet,并将请求处理到其中,然后文件将被读取并写入 servlet。
Guru_upload.java
package demotest;
import java.io.File;
import java.io.IOException;
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 guru_upload extends HttpServlet {
private static final long serialVersionUID = 1L;
public guru_upload() {
super();
// TODO Auto-generated constructor stub
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if(ServletFileUpload.isMultipartContent(request)){
try {
List <FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for(FileItem item : multiparts){
if(!item.isFormField()){
String name = new File(item.getName()).getName();
item.write( new File("c:/guru/upload" + File.separator + name));
}
}
//File uploaded successfully
request.setAttribute("gurumessage", "File Uploaded Successfully");
} catch (Exception ex) {
request.setAttribute("gurumessage", "File Upload Failed due to " + ex);
}
}else{
request.setAttribute("gurumessage","No File found");
}
request.getRequestDispatcher("/result.jsp").forward(request, response);
}
}
代码说明:
代码行12-14: 这里我们必须将 org.apache.commons 库导入到代码配置中。我们必须从 org.apache.commons 库导入 fileupload 类。
代码行23: 这里我们有 doPost() 方法,该方法将在我们在 JSP 中传递 POST 方法时被调用,它将请求和响应对象作为其参数
代码行26: 这里我们从 org.apache.commons 库中的 fileUpload 包中创建一个 ServletFileUpload 类的对象,它将检查 JSP 中是否有任何文件对象。如果找到,则将从请求中获取这些文件对象。
代码行27-32: 我们将通过检查多部分对象(一个列表对象)中存在多少个文件项来迭代文件数量(如果我们上传多个文件),并使用提供的文件名将其保存到 c:/guru/upload 文件夹中。我们使用 fileobject 的 write 方法将文件写入上述文件夹中。
代码行34: 如果没有异常,那么我们将请求中的属性设置为 gurumessage,其值为“文件上传成功”。
代码行35-36: 如果发生异常则设置消息“文件上传失败”
代码行40: 如果未找到文件则将消息设置为“未找到文件”
代码行42: 使用 requestdispatcher 对象将请求转发到具有请求和响应对象的 result.jsp。
结果.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Guru Result</title>
</head>
<body>
<% String msg = (String)request.getAttribute("message");
out.println(msg);
%>
</body>
</html>
代码说明:
代码行10: 这里我们从请求对象中获取值为 gurumessage 的属性并将其放入字符串对象中。
代码行11: 我们在这里打印该消息。
当我们执行上述代码时,我们得到以下输出
输出:
我们得到一个表单,其中有字段用于从目录中选择文件。一旦选择了文件,我们就必须单击上传按钮。
一旦单击上传按钮,我们就会收到文件上传成功的消息。
在下图中我们可以看到文件已上传到 c:/guru/upload 文件夹。
JSP文件下载
在这个例子中,我们将通过单击按钮从目录下载文件。
下载_1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Downloading Guru Example</title>
</head>
<body>
Guru Downloading File<a href="guru_download">Download here!!!</a>
</body>
</html>
代码说明:
代码行10: 这里我们给出了使用 servlet guru_download 从文件夹 c:/guru/upload 下载文件的链接。
Guru_下载.java
package demotest;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class guru_download
*/
public class guru_download extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String gurufile = "test.txt";
String gurupath = "c:/guru/upload/";
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", "attachment; filename=\""
+ gurufile + "\"");
FileInputStream fileInputStream = new FileInputStream(gurupath
+ gurufile);
int i;
while ((i = fileInputStream.read()) != -1) {
out.write(i);
}
fileInputStream.close();
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
代码说明:
代码行3-5: 这里我们从 java.io 包中导入 FileInputStream、IO Exception 和 PrintWriter。
代码行15: 我们正在定义 guru_download 小服务程序 它扩展了 HttpServlet。
代码行18: 因为我们已经定义了一个 href,它将被包含在 URL 中,所以 GET 方法将被处理(doGet 将在 servlet 中调用),它还包含请求和响应对象。
代码行19-20: 我们在响应对象中设置内容类型并从响应中获取编写器对象。
代码行21-22: 将变量定义为 gurufile,值为 test.txt,将 gurupath 定义为 c:/guru/upload/
代码行23-25: 我们使用响应对象设置内容类型,并使用 setHeader 方法将标头设置为响应对象作为已上传的文件名。
代码行27-28: 我们正在创建 FileInputStream,我们将在其中添加 gurupath+gurufile。
代码行31-33: 在这里我们采取了 while循环 它将一直运行直到文件被读取,因此我们给出的条件是 != -1。在这种情况下,我们使用 printwriter 对象进行写入。
执行上述代码时,你将获得以下输出
输出:
输出:
我们必须点击 downloading_1.jsp,然后会出现一个超链接“在此处下载”。当您点击此超链接文件时,它将被下载到系统中。
结语
- 我们已经了解了注册任何应用程序的注册表单
- 进一步了解登录和注销表单的工作原理。
- 还了解了通过 JSP 上传和下载文件。





