JSP 文件上传和下载
在此示例中,我们将学习如何通过 JSP 上传和下载文件。
文件输入输出是非常重要的操作。在这里,我们将使用 JSP 读取和写入文件。
JSP 文件上传
- 我们可以使用 JSP 上传任何文件。
- 它可以是文本文件、二进制文件、图像文件或其他任何文档。
- 在这里,对于文件上传,将仅使用 POST 方法,而不使用 GET 方法。
- enctype 属性应设置为 multipart/form-data。
示例:使用 Action
在此示例中,我们使用 IO 对象上传文件
Action_file.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>
Action_file_upload.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>
代码解释
Action_file.jsp
代码 12-18 行:在这里,我们创建了一个带有文件字段的表单,它将文件上传到服务器,并将 action 传递给 action_file_upload.jsp。
Action_file_upload.jsp
代码 20 行:在这里,我们为特定路径指定了文件路径。
代码 23-38 行:在这里,我们检查内容类型是否为 multipart/form-data。如果是这种情况,则内容是文件类型,并被读取。文件被读取后,它被写入临时文件,然后临时文件转换为主文件。
当您执行上述代码时,您会得到以下输出
输出
我们通过“选择文件”按钮上传文件,而“上传文件”按钮将文件上传到服务器上提供的路径。
示例:使用 JSP 操作
在此示例中,我们将使用 JSP 操作上传文件。我们将创建一个具有“上传”按钮的表单,当您单击上传按钮时,文件将被上传。
Uploading_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 行:在这里,我们创建了一个表单,其 action 指向 servlet guru_upload,该 action 通过 POST 方法传递。此外,这里有 enctype,即属性,它指定表单数据应如何编码并发送到服务器,并且仅与 POST 方法一起使用。我们在这里设置为 multipart/form-data,这是用于文件的(因为数据会很大)。
代码 13 行:在这里,我们指定了名为 guru_file、类型为 file 且大小为 50 的元素。
代码 15 行:这是一个提交类型的按钮,上面有“上传”字样,通过它将调用 action 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 行:我们将通过检查 multipart 对象(这是一个列表对象(如果我们上传多个文件))中存在多少个文件项来迭代文件数量,并将其以提供的文件名保存到 c:/guru/upload 文件夹中。我们使用 fileobject 的 write 方法将文件写入指定文件夹。
代码 34 行:如果没有异常,我们将请求中的属性设置为 gurumessage,值为“文件上传成功”。
代码 35-36 行:如果发生异常,则设置消息“文件上传失败”。
代码 40 行:如果未找到文件,则将消息设置为“未找到文件”。
代码 42 行:使用 requestdispatcher 对象将请求转发到 result.jsp,并带上请求和响应对象。
Result.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 文件下载
在此示例中,我们将通过单击按钮从目录下载文件。
Downloading_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_download.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 行:我们定义了一个扩展 HttpServlet 的 guru_download servlet。
代码 18 行:由于我们定义了 href,它将被包含在 URL 中,因此 GET 方法将被处理(doGet 将在 servlet 中调用),它还包含请求和响应对象。
代码 19-20 行:我们在 response 对象中设置了 content Type,并从 response 获取了 writer 对象。
代码 21-22 行:定义一个变量 gurufile,值为 test.txt,以及 gurupath,值为 c:/guru/upload/。
代码 23-25 行:我们使用 response 对象设置了 content Type,并使用 setHeader 方法将文件名(已上传的文件名)作为 header 设置到 response 对象中。
代码 27-28 行:我们创建了一个 FileInputStream,其中将添加 gurupath+gurufile。
代码 31-33 行:在这里,我们使用了一个 while 循环,它将一直运行直到文件被读取,因此我们将条件设置为 != -1。在此条件下,我们使用 printwriter 对象 out 进行写入。
当您执行上述代码时,您将得到以下输出。
输出
输出
我们需要单击 downloading_1.jsp,然后会看到一个名为“在此下载”的超链接。当您单击此超链接文件时,它将被下载到系统中。
摘要
- 我们已经学习了注册表单以注册到任何应用程序。
- 进一步了解了登录和注销表单的工作原理。
- 还学习了通过 JSP 上传和下载文件。





