如何使用图片网址更新图片

时间:2020-01-21 14:35:13

标签: spring spring-boot jpa multipartform-data

我有采用多部分图像文件的方法,如果我想更新同一图像,那么显然我必须将图像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);
   }```

1 个答案:

答案 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