首页 > 解决方案 > 创建目录并将图像上传到远程 Web 服务器

问题描述

我正在一个处理大量图像的网站上工作。用户将能够上传图片。图像将托管在单独的远程 Nginx 服务器上。创建目录并将图像上传到远程服务器的最佳方法是什么?SSH 会是一个可行的选择吗?有什么更好的吗?

使用 Spring Boot 创建 Web 应用程序

标签: linuxspringspring-bootnginxweb-development-server

解决方案


SSH 不会真正帮助您通过网络共享或同步文件。

根据您的标签(linux),我怀疑您可以nfs-kernel-server在“远程”服务器上安装。网络文件系统 (NFS) 允许您通过网络将目录从一个操作系统共享到另一个操作系统。这将允许您与 Spring Boot 服务器共享远程服务器的目录。

您可以按照这些说明设置您的 NFS 服务器。

然后,您可以使用以下命令将该远程目录挂载到 Spring Boot 服务器上:

$ NFS_SERVER="<your remote server>:/<your exported directory>"
$ sudo mount -t nfs "${NFS_SERVER}" /mnt

向 /mnt 读取和写入文件实际上是将它们读取和写入到远程服务器上的目录。因此,您需要做的就是让您的 Spring Boot 应用程序读取和写入/mnt.

您还可以查看社区项目Spring Content。该项目是对 Storage 的抽象,并提供了一系列 Storage 类型的实现,包括良好的旧 Filesystem,因此它非常适合您的用例,并将通过消除您自己编写文件处理控制器和服务的代码来简化您的 Spring 应用程序代码。

添加它看起来像这样:

pom.xml(假设是 Maven)。

    <!-- Java API -->
    <!-- just change this depdendency if you want to store somewhere else -->
    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-fs-boot-starter</artifactId>
        <version>0.8.0</version>
    </dependency>
    <!-- REST API -->
    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-rest-boot-starter</artifactId>
        <version>0.8.0</version>
    </dependency>

StoreConfig.java

@Configuration
@EnableFilesystemStores
@Import(RestConfiguration.class)
public class StoreConfig {

    @Bean
    FileSystemResourceLoader fileSystemResourceLoader() throws IOException {
        return new FileSystemResourceLoader(new File("/mnt").getAbsolutePath());
    }

}

文件存储.java

  @StoreRestResource(path="files")
  public interface FileStore extends Store<String> {
  }

就是这样。FileStore本质上是一个通用的 Spring ResourceLoader 。该spring-content-fs-boot-starter依赖项将导致 Spring Content 注入基于文件系统的FileStore接口实现,因此您无需担心自己实现它。此外,spring-content-rest-boot-starter依赖项将使 Spring Content 也注入一个实现,该实现@Controller将 HTTP 请求转发到FileStore.

总而言之,您现在将拥有一个功能齐全的(POST、PUT、GET、DELETE)基于 REST 的文件服务,/files该服务将使用您FileStore在 中检索(和存储)文件/mnt;即在您的远程 NFS 服务器上。

所以:

curl -F file=@/path/to/local/an-image.jpg /files/some-directory/an-image.jpg

将上传an-image.jpg并存储在/mnt/您的服务器上。

GET /files/some-directory/an-image.jpg

an-image.jpg再次下载。

高温高压

注入的控制器也支持视频流,以防万一。

如果您希望记录有关用户上传的文件的其他元数据,那么您还可以将内容与 Spring Data 实体相关联(可用于记录此附加元数据)。您可以在此处阅读更多相关信息。

高温高压


推荐阅读