我有采用多部分图像文件的方法,如果我想更新同一图像,那么显然我必须将图像URL作为输入,但是由于它采用文件格式,因此我无法将输入作为URL 我的方法:
MediaType.APPLICATION_OCTET_STREAM_VALUE}, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ApiResponse> updatePersonalDataForUser(
@RequestHeader("accessToken") @NotEmpty(message = "accessToken is mandatory") String bearer,
@RequestHeader("mappingId") @NotEmpty(message = "mappingId is mandatory") String mappingId,
@RequestPart("personalInfoObj") String personalInfoObj,
@RequestPart(value = "profileImage") MultipartFile profileImage)
throws IOException {
jobPostController.userRoleAuthorization(mappingId);
userController.oAuthByRedisAccessToken(bearer, mappingId);
ObjectMapper objectMapper = new ObjectMapper();
PersonalInfoResponse personalInfoConv = objectMapper.readValue(personalInfoObj, PersonalInfoResponse.class);
return userController.updatePersonalData(mappingId, personalInfoConv, profileImage, Contants.UserRoleName);
}```
答案 0 :(得分:0)
您应该看一下名为Spring Content的Spring社区项目。
通过该项目,可以轻松构建内容丰富的应用程序和服务。它具有与Spring Data相同的编程模型。这意味着它可以为文件存储和该文件存储之上的REST控制器提供实现,因此您无需担心自己创建这些存储。对于内容(或非结构化数据)来说,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>1.0.0.M5</version>
</dependency>
<!-- REST API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest</artifactId>
<version>1.0.0.M5</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());
}
}
ImageStore.java
@StoreRestResource(path="images")
public interface ImageStore extends Store<String> {
}
这是获取REST端点所需要做的所有工作,这些端点将允许您存储和检索文件。如前所述,这实际上是如何工作的非常类似于Spring Data。当您的应用程序启动时,Spring Content将看到spring-content-fs
依赖性,知道您想将内容存储在文件系统上,并将ImageStore
接口的文件系统实现注入到应用程序上下文中。它还将看到spring-content-rest
并注入与ImageStore
接口对话的控制器(即REST端点)。因此,您不必自己执行任何此操作。
例如,
curl -X POST /images/myimage.jpg -F "file=@/path/to/myimage.jpg"
将图像存储在/path/to/your/uploaded/files/myimage.jpg
上的文件系统上
并且:
curl /images/myimage.jpg
将再次获取它,依此类推...这些端点支持完整的CRUD,而GET&PUT端点也支持视频流(或字节范围请求)。
您还可以通过将spring-content-fs
依赖项交换为适当的Spring Content Storage模块,来决定将内容存储在实体中的其他位置,如数据库中的实体中,或在S3中。每种存储类型的示例均为here。
此外,如果有帮助,通常将内容与Spring数据实体相关联。因此,也可以让ImageStore接口实现ContentStore,如下所示:
> FileStore.java
@StoreRestResource(path="images")
public interface ImageStore extends ContentStore<PersonalInfo, String> {
}
并向您的Spring Data实体添加带有Spring Content注释的字段,如下所示:
> PersonalInfo.java
@Entity
public class PersonalInfo {
@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 /personalInfos/{personalInfoId} -F "image=@/some/path/to/myimage.jpg"
会将myimage.jpg
上传到/path/to/your/uploaded/files/myimage.jpg
。与以前一样,但它还将更新ID为personalInfoId
的PersonalInfo实体上的字段。
GET /personalInfos/{personalInfoId}
将再次获得它。
HTH