文件上传后如何获得下载网址

时间:2019-04-23 20:46:34

标签: java spring spring-mvc

我有一个使用SpringMVC的后端服务器,并使用以下代码接收来自用户的文件上传:

String imgPath = FileUtil.transferFile(imageFile);

这将生成服务器上载到imgPath中的文件的绝对路径。但是现在我需要有一个指向该文件的公共路径,以便前端可以下载该文件,因为我们位于两个不同的服务器上。

www.xxx.com/file/img.jpg

谁能给我一些想法,我应该怎么做? 预先感谢!

2 个答案:

答案 0 :(得分:0)

您可以为图像的位置添加静态资源处理程序:

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry
      .addResourceHandler("/file/**")
      .addResourceLocations("file:/path/to/images");
 }
}

答案 1 :(得分:0)

我会尝试一个名为Spring Content的社区项目。这提供了用于存储资源的抽象存储。它为您注入了服务实现和控制器,因此您无需自己编写。

添加它看起来像这样:

  

pom.xml(假设还提供Maven。也可以使用Spring Boot启动器)

    <!-- Java API -->
    <!-- just change this depdendency if you want to store somewhere else -->
    <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 StoreConfig {

    @Bean
    FileSystemResourceLoader fileSystemResourceLoader() throws IOException {
        return new FileSystemResourceLoader(new File("/path/to/uploaded/files").getAbsolutePath());
    }

}
  

FileStore.java

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

就是这样。 FileStore本质上是一个通用的Spring ResourceLoader。 spring-content-fs依赖性将导致Spring Content注入基于文件系统的实现。如果spring-content-rest将HTTP请求转发到@Controller服务的方法上,则FileStore依赖性将导致Spring Content也注入一个实现。

因此,您现在在/files处可以使用基于REST的全功能(POST,PUT,GET,DELETE)文件服务,该服务将使用您的FileStore来检索(和存储){{ 1}}。

所以:

/path/to/uploaded/files

将上传curl --upload-file some-image.jpg /files/some-image.jpg并将其存储在服务器上的some-image.jpg中。

并且:

/path/to/uploaded/files

将再次检索它。在您的情况下,这就是您在curl /files/some-image.jpg标记中使用的URL。

HTH

在有用的情况下,注入的控制器也支持视频流。

使用此方法,您也可以删除所有控制器和服务代码,因为不再需要它。另外,由于Spring Content是对存储的抽象,将来,您还可以转移到Spring Content支持的任何其他存储介质上。以S3为例。