0

我正在使用 Spring Boot 使用 Spring Data-Jpa。我有一个多部分表单将文件上传到数据库,其中包含附加字段,例如(名字、姓氏、电子邮件、简历等)但我不断收到此错误消息,用于将多部分文件转换为所需的字节 [] 类型。如何将 pdf 文件从多部分文件转换为 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 类型的属性值转换为属性恢复所需的类型 byte[];嵌套异常是 java.lang.IllegalArgumentException:无法将 org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile 类型的值转换为属性恢复 [0] 所需的类型字节:PropertyEditor [org.springframework.beans.propertyeditors.CustomNumberEditor]返回 org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile 类型的不适当值

4

2 回答 2

1

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

下面是一个示例示例(使用 hibernate/jpa 的 spring boot),用于将图像数据作为 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;

}
于 2020-02-25T09:07:27.627 回答
0

这是 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-08-24T18:06:36.117 回答