【问题标题】:I wanna convert MultipartFile to required type byte[] but I'm getting an error我想将 MultipartFile 转换为所需的类型 byte[] 但出现错误
【发布时间】:2020-06-08 23:02:30
【问题描述】:

我正在使用 Spring Boot 使用 Spring Data-Jpa。 我有一个多部分表单将文件上传到数据库,其中包含附加字段,例如(名字、姓氏、电子邮件、简历等) 但我不断收到此错误消息,用于将多部分文件转换为所需的字节 [] 类型。 如何将 pdf 文件从 multipart 文件转换为 byte[] 类型?

这是我的控制器类

@RequestMapping(value = "/jobs/applyJob/{id}", method = RequestMethod.POST)
public String handleFormSubmit(@PathVariable Long id, @ModelAttribute @Valid Candidate candidate,
        BindingResult bindingResult, @RequestParam("resume") MultipartFile file,
        RedirectAttributes redirectAttributes) {
    Job job = jobService.findJob(id);
    candidate.setJob(job);
    if (file.isEmpty()) {
        return null;
    }
    try {
        byte[] content  = file.getBytes();
        Path path = Paths.get(UPLOAD_FOLDER + file.getOriginalFilename());
        Files.write(path, content);


    } catch (IOException e) {
        e.printStackTrace();
    }

    if (bindingResult.hasErrors()) {
        return "applyJob";
    }

    redirectAttributes.addFlashAttribute("message", "Job applied !");
    return "redirect:/jobs";
}

我的实体:

@Entity
@Table(name = "candidates")
public class Candidate {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotEmpty
    @Column(name = "first_name", length = 50)
    private String firstName;

    @NotEmpty
    @Column(name = "last_name", length = 50)
    private String lastName;

    @NotEmpty
    @Column(name = "email", length = 100)
    private String email;

    @NotEmpty
    @Column(name = "phone", length = 15)
    private String phone;

    @NotEmpty
    @Column(name = "address", length = 255)
    private String address;

    @NotEmpty
    @Column(name = "thoughts_on_job", length = 255)
    private String thoughtsOnJob;

    @NotEmpty
    @Column(name = "resume")
    @Lob
    private byte[] resume;

我的错误:

转换类型的属性值失败 org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile 属性恢复所需的类型字节[];嵌套异常是 java.lang.IllegalArgumentException:无法转换类型的值 org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile 属性 resume[0] 所需的类型字节:PropertyEditor [org.springframework.beans.propertyeditors.CustomNumberEditor] 返回不适当的类型值 org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    确保在前端应用程序的上传表单中提供 enctype="multipart/form-data"。

    下面是一个示例(spring boot with hibernate/jpa),用于将图像数据作为 byte[] (lob/blob) 保存到 mysql 数据库中:

    控制器:

    public ResponseEntity<?> uploadFile(@NotBlank @PathVariable String userId,
                                        @RequestParam(value = "profileType", defaultValue = "LOGO", required = false) String profileType,
                                        @RequestParam("avatarFile") MultipartFile avatarFile) {
        return userService.storeFile(user, profileType, avatarFile);
     }
    

    服务:

     @Override
    public userImageData storeFile(user user, String profileType, MultipartFile file) {
        log.debug(String.format("Executing < %s.%s#%s()", THIS_CLASS.getPackage().getName(),this.getClass(), new Object() {}.getClass().getEnclosingMethod().getName()));
        if(file != null && !isEmpty(file.getOriginalFilename())){
            String fileName = StringUtils.cleanPath(file.getOriginalFilename());
    
            try {
                if (fileName.contains("..")) {
                    throw new FileStorageException("Sorry! Filename contains invalid path sequence " + fileName);
                }
                userImageData userAvatar = new userImageData();
                Optional<userImageData> userAvatarOp  = imageDataRepository.findByuserImageDatauserEqualsAndImageTypeEquals(user, profileType);
    
    
                if(userAvatarOp.isPresent()){
                    userAvatar = userAvatarOp.get();
                }
    
                userAvatar.setuserImageDatauser(user);
                userAvatar.setImageType(profileType);
                userAvatar.setFileName(fileName);
                userAvatar.setFileType(file.getContentType());
                userAvatar.setData(file.getBytes());
                userAvatar.setFileSize(file.getSize());
                userAvatar.setUploadId(UUID.randomUUID().toString());
    
                return imageDataRepository.save(userAvatar);
            } catch (IOException ex) {
                throw new FileStorageException("Could not store file " + fileName + ". Please try again!", ex);
            }
        }
        log.error("Invalid user image data. Please try again!");
        return null;
    }
    

    波乔:

    @Entity
    @Table(name = "user_avatar")
    public class userImageData {
    
    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    @Column(name = "user_avatar_Id")
    private String userImageId;
    
    @ManyToOne
    @JoinColumn(name = "user_id")
    @JsonIgnore
    private user userImageDatauser;
    
    private String imageType;
    private String fileName;
    private String fileType;
    private Long fileSize;
    @Lob
    private byte[] data;
    @Transient
    private String fileAccessUri;
    
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    private String uploadId;
    
    }
    

    【讨论】:

      【解决方案2】:

      这是Spring MVC处理上传文件时的常见问题,无法将上传文件自动转换为字节数组。为了让它工作,你必须在 SimpleFormController 的 initBinder() 方法中注册一个自定义编辑器(ByteArrayMultipartFileEditor)来指导 Spring 将上传的文件转换为字节数组。

      在你的控制器中使用这个:

      @Override
          protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder)
              throws ServletException {
              
              // Convert multipart object to byte[]
              binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
              
          }
      

      如果您使用带注释的控制器,而不是覆盖,请使用注释@InitBinder

      您可以通过以下链接找到更多解释: https://mkyong.com/spring-mvc/spring-mvc-failed-to-convert-property-value-in-file-upload-form/

      我在那里得到了答案,我想和你分享它

      【讨论】:

        猜你喜欢
        • 2021-06-11
        • 2020-05-07
        • 1970-01-01
        • 2014-02-20
        • 2012-01-10
        • 2014-09-01
        • 2015-06-04
        • 2017-07-02
        • 1970-01-01
        相关资源
        最近更新 更多