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 File Upload

输出

我们通过“选择文件”按钮上传文件,而“上传文件”按钮将文件上传到服务器上提供的路径。

示例:使用 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 行:在这里,我们打印该消息。

当我们执行上述代码时,我们会得到以下输出。

输出

我们会看到一个表单,其中有从目录中选择文件的字段。选择文件后,我们必须单击上传按钮。

File Upload Using JSP operations

单击上传按钮后,我们会收到一条消息,表明文件已成功上传。

File Upload Using JSP operations

在下面的图中,我们可以看到文件已上传到 c:/guru/upload 文件夹。

File Upload Using JSP operations

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 File

输出

我们需要单击 downloading_1.jsp,然后会看到一个名为“在此下载”的超链接。当您单击此超链接文件时,它将被下载到系统中。

摘要

  • 我们已经学习了注册表单以注册到任何应用程序。
  • 进一步了解了登录和注销表单的工作原理。
  • 还学习了通过 JSP 上传和下载文件。