首页 > 解决方案 > Springboot文件上传发生并且数据保存在数据库中但给出500错误

问题描述

我有一个有用户@entity 的类。其中有一张需要更新的个人资料图片,当我通过@Query 图像名称更新时,我也可以在文件夹中看到图像。但是在我的 API 中,我有一个 imageName 返回,所以我可以进行同步更改。奇怪的部分是当我上传图像时,图像也会上传到文件夹和数据库中,但会抛出 500 错误。以前从未见过这种情况。任何帮助将不胜感激。

POJO类

@Entity
@Table(name="users")
public class Users {

  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  @Column(name = "firstname")
  private String firstName;

  @Column(name = "lastname")
  private String lastName;

  @Id
  @Column(name = "username")
  private String username;

  @Column(name = "email")
  private String email;

  @Column(name = "role")
  private String role;

  @Column(name = "profile_picture")
  private String profilePicture;
}

头像类

public class ProfilePicture {
  private MultipartFile profileImage;
  private String profileImageName;
}

存储库

public interface ProfileRepository extends JpaRepository<Users, String> {
  @Query(value = "UPDATE users SET profile_picture = :saveImage WHERE username = :username", nativeQuery = true)
  public String updateUserProfilePictureForUsername(@Param("saveImage") String saveImage, @Param("username") String username);
}

服务:

public void saveProfileImage(ProfilePicture saveImage, String username) {
  String imageName = saveImage.getProfileImageName();
  profileRepo.updateUserProfilePictureForUsername(imageName, username);
}

REST API

@PostMapping(path = "/uploadprofileimage")
@ResponseStatus(HttpStatus.CREATED)
public String uploadProfilePicture(@RequestParam("image") MultipartFile Imagefile, @RequestParam("username") String username) throws IOException {

  String profileImageName = Imagefile.getOriginalFilename();
  ProfilePicture profileImage = new ProfilePicture();

  String fileFolderPath = "/Users/Desktop/Documents/" + username + /ProfilePictures/";
  File filePath = new File(fileFolderPath);
  if (!filePath.exists()) {
    filePath.mkdirs();
  }

  File file = new File(fileFolderPath, profileImageName);
  profileImage.setProfileImageName(profileImageName);
  profileImage.setProfileImage(Imagefile);
  profileImage.getProfileImage().transferTo(file);
  profileService.saveProfileImage(profileImage, username);
  return profileImage.getProfileImageName();
}

这是使用 Lambda 表达式的解决方案。

public Users saveProfileImage(ProfilePicture saveImage, String username) {
  String imageName = saveImage.getProfileImageName();

  return profileRepo.findById(username).map( user -> { 
    user.setProfilePicture(imageName);
    return profileRepo.save(user);
  }).orElseThrow(() -> new ResourceNotFoundException("Something went wrong "));
}

标签: javaspringpostgresqlspring-bootspring-mvc

解决方案


推荐阅读