我有一个使用SpringMVC的后端服务器,并使用以下代码从用户接收文件上传:
String imgPath = FileUtil.transferFile(imageFile);
这将生成服务器上传到 imgPath 的文件的绝对路径。但是现在我需要有一个该文件的公共路径,以便前端可以下载它,因为我们在两个不同的服务器上。类似的东西
www.xxx.com/file/img.jpg
谁能告诉我我应该怎么做? 提前感谢!
您可以为图像的位置添加静态资源处理程序:
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/file/**")
.addResourceLocations("file:/path/to/images");
}
}
我会尝试一个名为Spring Content的社区项目。 这为处理资源提供了对存储的抽象。 它为你注入服务实现和控制器,这样你就不需要自己编写。
添加它看起来像这样:
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</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>
存储配置.java
@Configuration
@EnableFilesystemStores
@Import(RestConfiguration.class)
public class StoreConfig {
@Bean
FileSystemResourceLoader fileSystemResourceLoader() throws IOException {
return new FileSystemResourceLoader(new File("/path/to/uploaded/files").getAbsolutePath());
}
}
文件存储.java
@StoreRestResource(path="files")
public interface FileStore extends Store<String> {
}
仅此而已。 FileStore 本质上是一个通用的 Spring ResourceLoader。spring-content-fs
依赖将导致 Spring Content 注入基于文件系统的实现。spring-content-rest
依赖关系将导致 Spring Content 也注入一个实现,如果@Controller
将 HTTP 请求转发到FileStore
服务的方法上。
因此,您现在将拥有一个功能齐全(POST,PUT,GET,DELETE)的基于REST的文件/files
服务,该服务将使用您的FileStore
在服务器上检索(和存储)/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
将再次检索它。 在您的情况下,这将是您在<img/>
标签中使用的网址。
呵呵
注入的控制器也支持视频流,以防有用。
这样,您还可以删除不再需要的所有控制器和服务代码。 另外,由于 Spring 内容是对存储的抽象,将来您还可以转向 Spring Content 支持的任何其他存储介质;例如 S3。