如何解决Java集成Google Drive上传文件项目中Postman相关错误?
问题背景
本项目实现功能为:将文件上传至Google Drive后拿到云存储生成的文件唯一ID,将文件ID、对应用户ID、文件名存入数据库,支持按用户ID查询上传文件列表。现调用Postman触发上传接口时报错,修复方案如下:
修复步骤
- 1. 修复JPQL查询语法错误
FileRepository中的自定义查询错误使用了数据库表名,JPQL需要基于实体类名查询,修改如下:
// 原错误代码 @Query("select file from file_details file where file.user_id = ?1") // 修改后代码 @Query("select file from FileEntity file where file.user_id = :userId") List<FileEntity> findByUserId(String userId);
- 2. 修正主键生成逻辑
你需要将Google Drive返回的fileId作为实体主键,不需要JPA自动生成主键,修改FileEntity的主键注解:
// 原错误代码 @Id @GeneratedValue private String file_id; // 修改后代码 @Id private String file_id;
- 3. 修正数据存储逻辑错误
createOrUpdateFile方法未给新实体赋值必填字段就直接保存,会导致数据库存空值,修改逻辑如下:
public FileEntity createOrUpdateFile(FileEntity fileEntity, String fileId, String user_id) { // 先赋值必填字段 fileEntity.setFile_id(fileId); fileEntity.setUser_id(user_id); // 文件名优先用上传文件的原名,也支持自定义传入 if (fileEntity.getFile_name() == null) { fileEntity.setFile_name("未命名文件"); } Optional<FileEntity> existFile = fileRepository.findById(fileId); if(existFile.isPresent()) { FileEntity newEntity = existFile.get(); newEntity.setUser_id(user_id); newEntity.setFile_name(fileEntity.getFile_name()); return fileRepository.save(newEntity); } else { return fileRepository.save(fileEntity); } }
- 4. 补全控制器参数绑定注解
上传接口的实体参数需要添加@ModelAttribute注解才能正常绑定表单参数,同时增加上传失败的异常处理:
@PostMapping(value = "/upload/{user_id}") public ResponseEntity<FileEntity> uploadFIle(@ModelAttribute FileEntity fileEntity, @RequestParam("file") MultipartFile file, @PathVariable String user_id){ String fileId = fileManager.uploadFile(file); // 处理Google Drive上传失败的情况 if (fileId == null) { return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } FileEntity updated = fileManager.createOrUpdateFile(fileEntity,fileId,user_id); return new ResponseEntity<>(updated, HttpStatus.OK); }
- 5. Postman请求配置说明
按以下配置调用接口即可正常运行:
- 请求类型选择
POST,请求地址格式为http://你的服务部署地址/upload/实际用户ID,替换路径中的实际用户ID为要绑定的用户标识 - 切换到
Body选项卡,勾选form-data - 新增参数,key填
file,类型下拉选择File,Value选择本地要上传的文件 - 如果需要自定义文件名,可新增key为
file_name的参数,Value填写自定义文件名
内容的提问来源于stack exchange,提问作者Linet M Shaji
相关产品推荐
相关产品推荐

