我有一个使用SpringMVC的后端服务器,并使用以下代码接收来自用户的文件上传:
String imgPath = FileUtil.transferFile(imageFile);
这将生成服务器上载到imgPath中的文件的绝对路径。但是现在我需要有一个指向该文件的公共路径,以便前端可以下载该文件,因为我们位于两个不同的服务器上。
www.xxx.com/file/img.jpg
谁能给我一些想法,我应该怎么做? 预先感谢!
答案 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为例。