Apache Jakarta Project: commons FileUpload用户指南

最近一段时间都在为文件上传这件事焦心,总是找不合适的代码,自己水平差写不出什么好东西出来,所以问题一直拖到现在。今天在google上看到commons FileUpload的相关简介,马上就去Apache Jakarta Project去找。哈哈……没错,就是它啦~
花了一个小时把它的E文Overview看了一下,觉得使用起来实在太方便了,短短地几句话就可以完成上传操作,真不赖,让我又可以小偷懒一把:P。下午,又写了一个简单的Bean来测试里面关键的类的使用,更具体的了解了它的方法作用的结果。再把那个E文User Guide主要的地方,在这里翻译一下。对于做页面上传文件的工作应该有一定的帮助。

Using FileUpload

使用FileUpload

FileUpload can be used in a number of different ways, depending upon the requirements of your application. In the simplest case, you will call a single method to parse the servlet request, and then process the list of items as they apply to your application. At the other end of the scale, you might decide to customize FileUpload to take full control of the way in which individual items are stored; for example, you might decide to stream the content into a database.
FileUpload可以根据应用程序的需求在很多不同的地方使用。举个很简单的例子,你可能调用一个简单的方法去编译servlet请求,并且把这些项目作为你的应用程序一部分来应用。从另一个方面来讲,你可能想自定义FileUpload来完成所有项目的存储;再来个例子,你可能想流化内容而存入数据库。

Here, we will describe the basic principles of FileUpload, and illustrate some of the simpler - and most common - usage patterns. Customization of FileUpload is described elsewhere .
这里我们会介绍FileUpload基础的使用原则,并描述一些简单的通用的使用模式。关于FileUpload自定义的介绍会在其它地方(其实那里什么也没有)讲。

How it works

简介

A file upload request comprises an ordered list of items that are encoded according to RFC 1867 , "Form-based File Upload in HTML". FileUpload can parse such a request and provide your application with a list of the individual uploaded items. Each such item implements t he FileItem inte***ce, regardless of its underlying implementation.
一个上传请求由一系列根据RFC1867(这个文章我已经放在BLOG收藏夹HTML目录下)编码的项目。FileUpload可以编译这样的请求并将这一系列的个性化上传项目传递给你的应用程序。每一个这样的项目都实现了FielItem接口,不管它是怎么实现的。

Each file item has a number of properties that might be of interest for your application. For example, every item has a name and a content type, and can provide an InputStream to access its data. On the other hand, you may need to process items differently, depending upon whether the item is a regular form field - that is, the data came from an ordinary text box or similar HTML field - or an uploaded file. The FileItem inte***ce provides the methods to make such a determination, and to access the data in the most appropriate manner.
每一个文件项目有一些自己的属性,这些属性也许正是你的应用程序感兴趣的地方。例如,每个项目有个一个名字和内容类型,并且可以提供一个输入流来访问这写数据。另一方面来看,你可能需要用不同方式来处理不同的项目,这就依赖与项目是否是一个正常的字域,也就是说,这些数据来自于一个普通的文本框或类似HTML的字域或一个上传文件。FileItem接口提供一些方法来做这样一个决定,并且访问这些数据用最合适的方法。

FileUpload creates new file items using a FileItemFactory . This is what gives FileUpload most of its flexibility. The factory has ultimate control over how each item is created. The default factory stores the item′s data in memory or on disk, depending on the size of the item (i.e. bytes of data). However, this behavior can be customized to suit your application.
FileUpload使用FileItemFactory创建一个新的文件项目。对于FileUpload来说这是完全可行的。工厂是唯一全盘控制每个项目的创建的工具。默认的工厂存储项目的数据在内存或者硬盘里,这都依赖于项目的大小(如,数据字节数组)。不过,还是可以把它定义成为合适你的应用程序使用的。

Parsing the request

Before you can work with the uploaded items, of course, you need to parse the request itself. Ensuring that the request is actually a file upload request is straightforward, but FileUpload makes it simplicity itself, by providing a static method to do just that.

在使用上传项目工作之前,你还需要编译请求。最重要的事情就要确定这个请求确实来自于文件上传,不过FileUpload利用一个静态方法使它自身简单化了。

// Check that we have a file upload request

boolean isMultipart = FileUpload.isMultipartContent(request);

Now we are ready to parse the request into its constituent items.

现在我们可以准备开始编译请求了。

The simplest case

简单的例子

The simplest usage scenario is the following:

Uploaded items should be retained in memory as long as they are reasonably small.
Larger items should be written to a temporary file on disk.
Very large upload requests should not be permitted.
The built-in defaults for the maximum size of an item to be retained in memory, the maximum permitted size of an upload request, and the location of temporary files are acceptable.
下面是一些简单的使用场景:

l        上传项目只要足够小,就应该保留在内存里。

l        较大的项目应该被写在硬盘的临时文件上。

l        非常大的上传请求应该避免。

l        限制项目在内存中所占的空间,限制最大的上传请求,并且设定临时文件的位置。

Handling a request in this scenario couldn′t be much simpler:

处理这个场景的请求很简单:

// Create a new file upload handler

DiskFileUpload upload = new DiskFileUpload();



// Parse the request

List /* FileItem */ items = upload.parseRequest(request);

That′s all that′s needed. Really!

这就是我们所需要的全部代码了!

The result of the parse is a List of file items, each of which implements the FileItem inte***ce. Processing these items is discussed below.

编译的结果就是生成了一系列文件项目,每个文件项目实现一个FileItem接口。下面将介绍如何处理这写项目。

Exercising more control

控制练习

If your usage scenario is close to the simplest case, described above, but you need a little more control over the size thresholds or the location of temporary files, you can customize the behavior using the methods of the DiskFileUpload class, like this:

如果你的使用场景和最简单例子很接近,但是你又需要一点点扩展的控制,包括大小的极限或者临时文件的设置等,你可以通过DiskFileUpload类的方法来自定义行为,像这样:

// Create a new file upload handler

DiskFileUpload upload = new DiskFileUpload();



// Set upload parameters

upload.setSizeThreshold(yourMaxMemorySize);

upload.setSizeMax(yourMaxRequestSize);

upload.setRepositoryPath(yourTempDirectory);



// Parse the request

List /* FileItem */ items = upload.parseRequest(request);

Of course, each of the configuration methods is independent of the others, but if you want to configure them all at once, you can do that with an alternate parseRequest() method, like this:

当然,每个配置方法是独立于其它任意一个的,但是如果你想一次性配置他们,你可以用parseRequest()的另一个重载方法,像这样:

最近一段时间都在为文件上传这件事焦心,总是找不合适的代码,自己水平差写不出什么好东西出来,所以问题一直拖到现在。今天在google上看到commons FileUpload的相关简介,马上就去Apache Jakarta Project去找。哈哈……没错,就是它啦~
花了一个小时把它的E文Overview看了一下,觉得使用起来实在太方便了,短短地几句话就可以完成上传操作,真不赖,让我又可以小偷懒一把:P。下午,又写了一个简单的Bean来测试里面关键的类的使用,更具体的了解了它的方法作用的结果。再把那个E文User Guide主要的地方,在这里翻译一下。对于做页面上传文件的工作应该有一定的帮助。

Using FileUpload

使用FileUpload

FileUpload can be used in a number of different ways, depending upon the requirements of your application. In the simplest case, you will call a single method to parse the servlet request, and then process the list of items as they apply to your application. At the other end of the scale, you might decide to customize FileUpload to take full control of the way in which individual items are stored; for example, you might decide to stream the content into a database.
FileUpload可以根据应用程序的需求在很多不同的地方使用。举个很简单的例子,你可能调用一个简单的方法去编译servlet请求,并且把这些项目作为你的应用程序一部分来应用。从另一个方面来讲,你可能想自定义FileUpload来完成所有项目的存储;再来个例子,你可能想流化内容而存入数据库。

Here, we will describe the basic principles of FileUpload, and illustrate some of the simpler - and most common - usage patterns. Customization of FileUpload is described elsewhere .
这里我们会介绍FileUpload基础的使用原则,并描述一些简单的通用的使用模式。关于FileUpload自定义的介绍会在其它地方(其实那里什么也没有)讲。

How it works

简介

A file upload request comprises an ordered list of items that are encoded according to RFC 1867 , "Form-based File Upload in HTML". FileUpload can parse such a request and provide your application with a list of the individual uploaded items. Each such item implements t he FileItem inte***ce, regardless of its underlying implementation.
一个上传请求由一系列根据RFC1867(这个文章我已经放在BLOG收藏夹HTML目录下)编码的项目。FileUpload可以编译这样的请求并将这一系列的个性化上传项目传递给你的应用程序。每一个这样的项目都实现了FielItem接口,不管它是怎么实现的。

Each file item has a number of properties that might be of interest for your application. For example, every item has a name and a content type, and can provide an InputStream to access its data. On the other hand, you may need to process items differently, depending upon whether the item is a regular form field - that is, the data came from an ordinary text box or similar HTML field - or an uploaded file. The FileItem inte***ce provides the methods to make such a determination, and to access the data in the most appropriate manner.
每一个文件项目有一些自己的属性,这些属性也许正是你的应用程序感兴趣的地方。例如,每个项目有个一个名字和内容类型,并且可以提供一个输入流来访问这写数据。另一方面来看,你可能需要用不同方式来处理不同的项目,这就依赖与项目是否是一个正常的字域,也就是说,这些数据来自于一个普通的文本框或类似HTML的字域或一个上传文件。FileItem接口提供一些方法来做这样一个决定,并且访问这些数据用最合适的方法。

FileUpload creates new file items using a FileItemFactory . This is what gives FileUpload most of its flexibility. The factory has ultimate control over how each item is created. The default factory stores the item′s data in memory or on disk, depending on the size of the item (i.e. bytes of data). However, this behavior can be customized to suit your application.
FileUpload使用FileItemFactory创建一个新的文件项目。对于FileUpload来说这是完全可行的。工厂是唯一全盘控制每个项目的创建的工具。默认的工厂存储项目的数据在内存或者硬盘里,这都依赖于项目的大小(如,数据字节数组)。不过,还是可以把它定义成为合适你的应用程序使用的。

Parsing the request

Before you can work with the uploaded items, of course, you need to parse the request itself. Ensuring that the request is actually a file upload request is straightforward, but FileUpload makes it simplicity itself, by providing a static method to do just that.

在使用上传项目工作之前,你还需要编译请求。最重要的事情就要确定这个请求确实来自于文件上传,不过FileUpload利用一个静态方法使它自身简单化了。

// Check that we have a file upload request

boolean isMultipart = FileUpload.isMultipartContent(request);

Now we are ready to parse the request into its constituent items.

现在我们可以准备开始编译请求了。

The simplest case

简单的例子

The simplest usage scenario is the following:

Uploaded items should be retained in memory as long as they are reasonably small.
Larger items should be written to a temporary file on disk.
Very large upload requests should not be permitted.
The built-in defaults for the maximum size of an item to be retained in memory, the maximum permitted size of an upload request, and the location of temporary files are acceptable.
下面是一些简单的使用场景:

l        上传项目只要足够小,就应该保留在内存里。

l        较大的项目应该被写在硬盘的临时文件上。

l        非常大的上传请求应该避免。

l        限制项目在内存中所占的空间,限制最大的上传请求,并且设定临时文件的位置。

Handling a request in this scenario couldn′t be much simpler:

处理这个场景的请求很简单:

// Create a new file upload handler

DiskFileUpload upload = new DiskFileUpload();



// Parse the request

List /* FileItem */ items = upload.parseRequest(request);

That′s all that′s needed. Really!

这就是我们所需要的全部代码了!

The result of the parse is a List of file items, each of which implements the FileItem inte***ce. Processing these items is discussed below.

编译的结果就是生成了一系列文件项目,每个文件项目实现一个FileItem接口。下面将介绍如何处理这写项目。

Exercising more control

控制练习

If your usage scenario is close to the simplest case, described above, but you need a little more control over the size thresholds or the location of temporary files, you can customize the behavior using the methods of the DiskFileUpload class, like this:

如果你的使用场景和最简单例子很接近,但是你又需要一点点扩展的控制,包括大小的极限或者临时文件的设置等,你可以通过DiskFileUpload类的方法来自定义行为,像这样:

// Create a new file upload handler

DiskFileUpload upload = new DiskFileUpload();



// Set upload parameters

upload.setSizeThreshold(yourMaxMemorySize);

upload.setSizeMax(yourMaxRequestSize);

upload.setRepositoryPath(yourTempDirectory);



// Parse the request

List /* FileItem */ items = upload.parseRequest(request);

Of course, each of the configuration methods is independent of the others, but if you want to configure them all at once, you can do that with an alternate parseRequest() method, like this:

当然,每个配置方法是独立于其它任意一个的,但是如果你想一次性配置他们,你可以用parseRequest()的另一个重载方法,像这样

C:\Users\dell\.jdks\openjdk-23.0.1\bin\java.exe -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:D:\腾讯电脑管家软件搬家\软件搬家\IntelliJ IDEA 2024.3.1.1\lib\idea_rt.jar=49785:D:\腾讯电脑管家软件搬家\软件搬家\IntelliJ IDEA 2024.3.1.1\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\BaiduNetdiskDownload\demo\target\classes;C:\Users\dell\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.7.6\spring-boot-starter-aop-2.7.6.jar;C:\Users\dell\.m2\repository\org\aspectj\aspectjweaver\1.9.7\aspectjweaver-1.9.7.jar;C:\Users\dell\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.7.6\spring-boot-starter-jdbc-2.7.6.jar;C:\Users\dell\.m2\repository\com\zaxxer\HikariCP\4.0.3\HikariCP-4.0.3.jar;C:\Users\dell\.m2\repository\org\springframework\spring-jdbc\5.3.24\spring-jdbc-5.3.24.jar;C:\Users\dell\.m2\repository\jakarta\transaction\jakarta.transaction-api\1.3.3\jakarta.transaction-api-1.3.3.jar;C:\Users\dell\.m2\repository\jakarta\persistence\jakarta.persistence-api\2.2.3\jakarta.persistence-api-2.2.3.jar;C:\Users\dell\.m2\repository\org\hibernate\hibernate-core\5.6.14.Final\hibernate-core-5.6.14.Final.jar;C:\Users\dell\.m2\repository\org\jboss\logging\jboss-logging\3.4.3.Final\jboss-logging-3.4.3.Final.jar;C:\Users\dell\.m2\repository\net\bytebuddy\byte-buddy\1.12.19\byte-buddy-1.12.19.jar;C:\Users\dell\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\dell\.m2\repository\org\jboss\jandex\2.4.2.Final\jandex-2.4.2.Final.jar;C:\Users\dell\.m2\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;C:\Users\dell\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.1.2.Final\hibernate-commons-annotations-5.1.2.Final.jar;C:\Users\dell\.m2\repository\org\glassfish\jaxb\jaxb-runtime\2.3.7\jaxb-runtime-2.3.7.jar;C:\Users\dell\.m2\repository\org\glassfish\jaxb\txw2\2.3.7\txw2-2.3.7.jar;C:\Users\dell\.m2\repository\com\sun\istack\istack-commons-runtime\3.0.12\istack-commons-runtime-3.0.12.jar;C:\Users\dell\.m2\repository\com\sun\activation\jakarta.activation\1.2.2\jakarta.activation-1.2.2.jar;C:\Users\dell\.m2\repository\org\springframework\data\spring-data-jpa\2.7.6\spring-data-jpa-2.7.6.jar;C:\Users\dell\.m2\repository\org\springframework\data\spring-data-commons\2.7.6\spring-data-commons-2.7.6.jar;C:\Users\dell\.m2\repository\org\springframework\spring-orm\5.3.24\spring-orm-5.3.24.jar;C:\Users\dell\.m2\repository\org\springframework\spring-context\5.3.24\spring-context-5.3.24.jar;C:\Users\dell\.m2\repository\org\springframework\spring-tx\5.3.24\spring-tx-5.3.24.jar;C:\Users\dell\.m2\repository\org\springframework\spring-beans\5.3.24\spring-beans-5.3.24.jar;C:\Users\dell\.m2\repository\org\springframework\spring-aspects\5.3.24\spring-aspects-5.3.24.jar;C:\Users\dell\.m2\repository\org\springframework\boot\spring-boot-starter\2.7.6\spring-boot-starter-2.7.6.jar;C:\Users\dell\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.7.6\spring-boot-starter-logging-2.7.6.jar;C:\Users\dell\.m2\repository\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;C:\Users\dell\.m2\repository\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;C:\Users\dell\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;C:\Users\dell\.m2\repository\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;C:\Users\dell\.m2\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;C:\Users\dell\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\dell\.m2\repository\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;C:\Users\dell\.m2\repository\org\springframework\spring-aop\5.3.24\spring-aop-5.3.24.jar;C:\Users\dell\.m2\repository\org\springframework\security\spring-security-config\5.7.5\spring-security-config-5.7.5.jar;C:\Users\dell\.m2\repository\org\springframework\security\spring-security-web\5.7.5\spring-security-web-5.7.5.jar;C:\Users\dell\.m2\repository\org\springframework\spring-expression\5.3.24\spring-expression-5.3.24.jar;C:\Users\dell\.m2\repository\org\springframework\boot\spring-boot-starter-thymeleaf\2.7.6\spring-boot-starter-thymeleaf-2.7.6.jar;C:\Users\dell\.m2\repository\org\thymeleaf\thymeleaf-spring5\3.0.15.RELEASE\thymeleaf-spring5-3.0.15.RELEASE.jar;C:\Users\dell\.m2\repository\org\thymeleaf\thymeleaf\3.0.15.RELEASE\thymeleaf-3.0.15.RELEASE.jar;C:\Users\dell\.m2\repository\org\attoparser\attoparser\2.0.5.RELEASE\attoparser-2.0.5.RELEASE.jar;C:\Users\dell\.m2\repository\org\unbescape\unbescape\1.1.6.RELEASE\unbescape-1.1.6.RELEASE.jar;C:\Users\dell\.m2\repository\org\thymeleaf\extras\thymeleaf-extras-java8time\3.0.4.RELEASE\thymeleaf-extras-java8time-3.0.4.RELEASE.jar;C:\Users\dell\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.7.6\spring-boot-starter-web-2.7.6.jar;C:\Users\dell\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.7.6\spring-boot-starter-json-2.7.6.jar;C:\Users\dell\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.13.4.2\jackson-databind-2.13.4.2.jar;C:\Users\dell\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.4\jackson-annotations-2.13.4.jar;C:\Users\dell\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.13.4\jackson-core-2.13.4.jar;C:\Users\dell\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.4\jackson-datatype-jdk8-2.13.4.jar;C:\Users\dell\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.4\jackson-datatype-jsr310-2.13.4.jar;C:\Users\dell\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.4\jackson-module-parameter-names-2.13.4.jar;C:\Users\dell\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.7.6\spring-boot-starter-tomcat-2.7.6.jar;C:\Users\dell\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.69\tomcat-embed-core-9.0.69.jar;C:\Users\dell\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.69\tomcat-embed-websocket-9.0.69.jar;C:\Users\dell\.m2\repository\org\springframework\spring-web\5.3.24\spring-web-5.3.24.jar;C:\Users\dell\.m2\repository\org\springframework\spring-webmvc\5.3.24\spring-webmvc-5.3.24.jar;C:\Users\dell\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.69\tomcat-embed-el-9.0.69.jar;C:\Users\dell\.m2\repository\org\hibernate\validator\hibernate-validator\6.2.5.Final\hibernate-validator-6.2.5.Final.jar;C:\Users\dell\.m2\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;C:\Users\dell\.m2\repository\org\thymeleaf\extras\thymeleaf-extras-springsecurity6\3.1.2.RELEASE\thymeleaf-extras-springsecurity6-3.1.2.RELEASE.jar;C:\Users\dell\.m2\repository\org\thymeleaf\thymeleaf-spring6\3.1.2.RELEASE\thymeleaf-spring6-3.1.2.RELEASE.jar;C:\Users\dell\.m2\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;C:\Users\dell\.m2\repository\com\mysql\mysql-connector-j\8.0.31\mysql-connector-j-8.0.31.jar;C:\Users\dell\.m2\repository\org\projectlombok\lombok\1.18.30\lombok-1.18.30.jar;C:\Users\dell\.m2\repository\commons-fileupload\commons-fileupload\1.5\commons-fileupload-1.5.jar;C:\Users\dell\.m2\repository\commons-io\commons-io\2.11.0\commons-io-2.11.0.jar;C:\Users\dell\.m2\repository\org\springframework\boot\spring-boot\2.7.6\spring-boot-2.7.6.jar;C:\Users\dell\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.7.6\spring-boot-autoconfigure-2.7.6.jar;C:\Users\dell\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\2.3.3\jakarta.xml.bind-api-2.3.3.jar;C:\Users\dell\.m2\repository\jakarta\activation\jakarta.activation-api\1.2.2\jakarta.activation-api-1.2.2.jar;C:\Users\dell\.m2\repository\org\springframework\spring-core\5.3.24\spring-core-5.3.24.jar;C:\Users\dell\.m2\repository\org\springframework\spring-jcl\5.3.24\spring-jcl-5.3.24.jar;C:\Users\dell\.m2\repository\org\springframework\security\spring-security-core\5.7.5\spring-security-core-5.7.5.jar;C:\Users\dell\.m2\repository\org\springframework\security\spring-security-crypto\5.7.5\spring-security-crypto-5.7.5.jar com.example.club.ClubApplication . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.6) 2025-06-23 20:25:46.155 INFO 10184 --- [ main] com.example.club.ClubApplication : Starting ClubApplication using Java 23.0.1 on DESKTOP-TBMIJJH with PID 10184 (D:\BaiduNetdiskDownload\demo\target\classes started by dell in D:\BaiduNetdiskDownload\demo) 2025-06-23 20:25:46.156 DEBUG 10184 --- [ main] com.example.club.ClubApplication : Running with Spring Boot v2.7.6, Spring v5.3.24 2025-06-23 20:25:46.156 INFO 10184 --- [ main] com.example.club.ClubApplication : No active profile set, falling back to 1 default profile: "default" 2025-06-23 20:25:46.620 INFO 10184 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2025-06-23 20:25:46.662 INFO 10184 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 37 ms. Found 4 JPA repository interfaces. 2025-06-23 20:25:47.019 INFO 10184 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2025-06-23 20:25:47.026 INFO 10184 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2025-06-23 20:25:47.026 INFO 10184 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.69] 2025-06-23 20:25:47.123 INFO 10184 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2025-06-23 20:25:47.123 INFO 10184 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 926 ms 2025-06-23 20:25:47.219 INFO 10184 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2025-06-23 20:25:47.259 INFO 10184 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.6.14.Final 2025-06-23 20:25:47.365 INFO 10184 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} 2025-06-23 20:25:47.428 INFO 10184 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2025-06-23 20:25:47.531 INFO 10184 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2025-06-23 20:25:47.542 INFO 10184 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect Hibernate: create table activity ( id bigint not null auto_increment, content TEXT, cover_image varchar(255), publish_time datetime(6), title varchar(255), primary key (id) ) engine=InnoDB Hibernate: create table blog ( id bigint not null auto_increment, content TEXT, create_time datetime(6), title varchar(255), visibility varchar(255), user_id bigint, primary key (id) ) engine=InnoDB Hibernate: create table friendship ( id bigint not null auto_increment, status varchar(255), friend_id bigint, user_id bigint, primary key (id) ) engine=InnoDB Hibernate: create table user ( id bigint not null auto_increment, created_at datetime(6), email varchar(255) not null, failed_login_attempts integer not null, last_login datetime(6), password varchar(255) not null, profile_pic varchar(255), real_name varchar(255), role varchar(255), status varchar(255), username varchar(255) not null, primary key (id) ) engine=InnoDB Hibernate: alter table user drop index UK_sb8bbouer5wak8vyiiy4pf2bx Hibernate: alter table user add constraint UK_sb8bbouer5wak8vyiiy4pf2bx unique (username) Hibernate: alter table blog add constraint FKpxk2jtysqn41oop7lvxcp6dqq foreign key (user_id) references user (id) Hibernate: alter table friendship add constraint FK11spi5x122uxevijievf5g7iu foreign key (friend_id) references user (id) Hibernate: alter table friendship add constraint FKb9biiilqk4uo9g72qbaopolea foreign key (user_id) references user (id) 2025-06-23 20:25:48.148 INFO 10184 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 2025-06-23 20:25:48.153 INFO 10184 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2025-06-23 20:25:48.179 WARN 10184 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2025-06-23 20:25:48.595 INFO 10184 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@57e6d56a, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@5c1687d1, org.springframework.security.web.context.SecurityContextPersistenceFilter@478c84aa, org.springframework.security.web.header.HeaderWriterFilter@1ddc8fc, org.springframework.security.web.csrf.CsrfFilter@4745bcc6, org.springframework.security.web.authentication.logout.LogoutFilter@25d23478, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@299ddfff, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@18d1d137, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@3cab07dd, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@1504b493, org.springframework.security.web.session.SessionManagementFilter@1e288c76, org.springframework.security.web.access.ExceptionTranslationFilter@221961af, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@7fce1069] 2025-06-23 20:25:48.693 INFO 10184 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index 2025-06-23 20:25:48.839 INFO 10184 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2025-06-23 20:25:48.845 INFO 10184 --- [ main] com.example.club.ClubApplication : Started ClubApplication in 2.943 seconds (JVM running for 3.493)
最新发布
06-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值