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 上传和下载文件。