如何通过Http提供文件上传服务?

时间:2019-04-03 10:10:55

标签: java spring

我需要提供基于Http的文件上传服务。

我应该只使用SpringMVC来创建一个Java Web项目来通过控制器接收文件吗?还是有什么建议?

那么,首选选择哪个servlet容器? Tomcat?

谢谢!

1 个答案:

答案 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感到害羞。