我需要提供基于Http的文件上传服务。
我应该只使用SpringMVC来创建一个Java Web项目来通过控制器接收文件吗?还是有什么建议?
那么,首选选择哪个servlet容器? Tomcat?
谢谢!
答案 0 :(得分:1)
您应该看一下名为Spring Content的Spring社区项目。
通过该项目,可以轻松构建内容丰富的应用程序和服务。它具有与Spring Data相同的编程模型。这意味着它可以为文件存储和控制器实现提供实现,因此您不必担心自己创建它们。本质上,对于内容(或非结构化数据)而言,Spring Data对结构化数据的含义是什么。
这可能类似于以下内容:-
pom.xml(用于Spring Web MVC。还支持Spring Boot)
<!-- Spring Web MVC dependencies -->
...
<!-- Java API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-fs</artifactId>
<version>0.7.0</version>
</dependency>
<!-- REST API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest</artifactId>
<version>0.7.0</version>
</dependency>
StoreConfig.java
@Configuration
@EnableFilesystemStores
@Import(RestConfiguration.class)
public class EnableFilesystemStoresConfig {
@Bean
File filesystemRoot() {
try {
return new File("/path/to/your/uploaded/files");
} catch (IOException ioe) {}
return null;
}
@Bean
FileSystemResourceLoader fileSystemResourceLoader() {
return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
}
}
FileStore.java
@StoreRestResource(path="files")
public interface FileStore extends Store<String> {
}
这是获取REST端点所需要做的所有工作,这些端点将使您可以存储和检索文件。如前所述,这实际上是如何工作的非常类似于Spring Data。当您的应用程序启动时,Spring Content将看到spring-content-fs
依赖性,知道您想将内容存储在文件系统上,并将FileStore
接口的文件系统实现注入到应用程序上下文中。它还将看到spring-content-rest
并注入一个与文件存储接口通信的控件(即REST端点)。因此,您不必自己执行任何此操作。
例如,
curl -X POST /files/myfile.pdf -F "file=@/path/to/myfile.pdf"
会将文件存储在/path/to/your/uploaded/files/myfile.pdf
的文件系统上
并且:
curl /files/myfile.pdf
将再次获取它,依此类推...这些端点支持完整的CRUD,而GET&PUT端点也支持视频流(或字节范围请求)。
您还可以通过将spring-content-fs
依赖项交换为适当的Spring Content Storage模块,来决定将内容存储在实体中的其他位置,如数据库中的实体中,或在S3中。每种存储类型的示例均为here。
此外,如果有帮助,通常将内容与Spring数据实体相关联。因此,也可以让FileStore接口实现ContentStore,如下所示:
> FileStore.java
@StoreRestResource(path="files")
public interface FileStore extends ContentStore<File, String> {
}
并向您的Spring Data实体添加带有Spring Content注释的字段,如下所示:
> File.java
@Entity
public class File {
@Id
@GeneratedValue
private long id;
...other existing fields...
@ContentId
private String contentId;
@ContentLength
private long contentLength = 0L;
@MimeType
private String mimeType = "text/plain";
...
}
此方法更改了REST端点,因为现在可以通过Spring Data URL寻址内容。所以:
POST /files/{fileId} -F "image=@/some/path/to/myfile.pdf"
会将myfile.pdf
上传到/path/to/your/uploaded/files/myfile.pdf
。与以前一样,但它还将更新ID为fileId
的File实体上的字段。
GET /files/{fileId}
将再次得到它。
HTH 附言不要对提出问题/功能要求和/或我们正在积极寻求参与的PR感到害羞。