Java Servlet文件上传

时间:2020-02-23 14:37:15  来源:igfitidea点击:

这个例子演示了如何使用javaservlet上传文件

将文件上载到javaeeservlets始终是可能的,但是需要付出很大的努力才能完成。apachefoundation甚至构建了一个名为Commons FileUpload的库,以使这个任务更容易实现。然而,Servlet3.0规范修复了这一差距,并且自从JavaEE6以来,多部分配置选项被添加到Servlet中,引入了

getPart

getParts

方法

HttpServletRequest

.

如果我们对使用WebServices将文件上载到服务器感兴趣,可以查看本教程。

Servlet文件上传示例

Servlet文件上载示例演示了MultipartConfig注释的用法,并使用户能够上载一个或者两个文件。

这个示例项目的结构非常简单。它由一个servlet文件组成

FileUploadServlet.java

,

pom.xml

在生成时处理依赖关系

web.xml

. 正如我们在Servlet注释示例中已经讨论过的,我们可以在注释和部署描述符之间选择来设置Servlet配置。此示例使用注释。

下图为项目结构图

Servlet文件上载项目结构

在马文家pom.xml文件我们需要声明的唯一依赖项是javax.servlet

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>net.theitroad.tutorials</groupId>
	<artifactId>ServletFileUpload</artifactId>
	<version>1</version>
	<packaging>war</packaging>

	<name>ServletFileUpload</name>
	<url>https://theitroad.local</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>

	<build>
		<finalName>fileuploader</finalName>
      <sourceDirectory>src/main/java</sourceDirectory>

      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-war-plugin</artifactId>
              <version>2.3</version>
              <configuration>
                  <warSourceDirectory>src/main/webapp</warSourceDirectory>
              </configuration>
          </plugin>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.1</version>
              <configuration>
                  <source>1.8</source>
                  <target>1.8</target>
              </configuration>
          </plugin>
      </plugins>
  </build>
</project>

文件上传servlet是我们项目的核心。它只有两种方法

goGet

,其中显示上载表单和和

doPost

,完成整个上传工作。

package net.theitroad.tutorials;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@WebServlet(name = "uploadServlet", urlPatterns = { "/upload" }, loadOnStartup = 1)
@MultipartConfig(fileSizeThreshold = 6291456, //6 MB
		maxFileSize = 10485760L, //10 MB
		maxRequestSize = 20971520L //20 MB
)
public class FileUploadServlet extends HttpServlet {

	private static final long serialVersionUID = 5619951677845873534L;

	private static final String UPLOAD_DIR = "uploads";

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");

		PrintWriter writer = response.getWriter();
		writer.append("<!DOCTYPE html>\r\n")
		.append("<html>\r\n")
		.append("    <head>\r\n")
		.append("        <title>File Upload Form</title>\r\n")
		.append("    </head>\r\n")
		.append("    <body>\r\n");

		writer.append("<h1>Upload file</h1>\r\n");
		writer.append("<form method=\"POST\" action=\"upload\" ")
		.append("enctype=\"multipart/form-data\">\r\n");
		writer.append("<input type=\"file\" name=\"fileName1\"<br<br\r\n");
		writer.append("<input type=\"file\" name=\"fileName2\"<br<br\r\n");
		writer.append("<input type=\"submit\" value=\"Submit\"\r\n");
		writer.append("</form>\r\n");

		writer.append("    </body>\r\n").append("</html>\r\n");
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");

		//gets absolute path of the web application
		String applicationPath = request.getServletContext().getRealPath("");
		//constructs path of the directory to save uploaded file
		String uploadFilePath = applicationPath + File.separator + UPLOAD_DIR;

		//creates upload folder if it does not exists
		File uploadFolder = new File(uploadFilePath);
		if (!uploadFolder.exists()) {
			uploadFolder.mkdirs();
		}

		PrintWriter writer = response.getWriter();

		//write all files in upload folder
		for (Part part : request.getParts()) {
			if (part != null && part.getSize() > 0) {
				String fileName = part.getSubmittedFileName();
				String contentType = part.getContentType();

				//allows only JPEG files to be uploaded
				if (!contentType.equalsIgnoreCase("image/jpeg")) {
					continue;
				}

				part.write(uploadFilePath + File.separator + fileName);

				writer.append("File successfully uploaded to " 
						+ uploadFolder.getAbsolutePath() 
						+ File.separator
						+ fileName
						+ "<br>\r\n");
			}
		}

	}

}

这个

@MultipatrtConfig

注解使servlet能够接受文件上传。有3个重要属性:

fileSizeThreshold–文件写入临时目录前要超过的文件大小。如果文件小于此阈值,则在请求完成之前,文件将驻留在内存中。

maxFileSize–这是允许上载的文件的最大大小。在上面的示例中,不允许用户上载大于10 MB的文件

maxRequestSize–是我们尝试用一个请求上传的所有文件大小的最大总和。在上面的例子中,我们将这个值设置为20MB,这意味着不管文件的数量是多少,我们总共可以上传20MB

我们可能需要指定或者不指定第四个属性。它被称为

location

它指向web容器应该存储临时文件的目录。但是,如果不指定此属性,容器将使用默认的临时文件夹。

我们超越

doGet

方法显示具有两个文件选择器字段的简单窗体。我们可能需要添加另外的输入字段,因为多部分附件允许这样做。

上载文件的窗体

doPost

方法首先构造要存储上载文件的文件夹的路径。比我们用的还要多

request.getParts()

迭代用户选择要上载的文件,并最终将它们存储到所需的位置。

构建和部署后,我们可以在浏览器中访问该应用程序:http://localhost:8080/fileuploader/upload