求助帖!!! 智能云图库项目(已解决)
解决方法
在File Manager中少写了multipartFile.transferTo(file); 光传了一个空的临时文件,有点搞笑了
描述
不知道为什么,我这个图片上传的功能不能用,但是之前的那个File Controller文件中的测试文件上传的接口却可以使用,应该不是配置的COS的问题,但具体的我又搞不懂,求大佬帮忙看看.感谢
报错信息
▼js复制代码Missing http body (Status Code: 500; Error Code: InternalError; Request ID: NjdjODg5YzFfZjMxMDc2MDlfMTNiYjVfNzA3NGIyYQ==); Trace ID: OGVmYzZiMmQzYjA2OWNhODk0NTRkMTBiOWVmMDAxODc0OWRkZjk0ZDM1NmI1M2E2MTRlY2MzZDhmNmI5MWI1OWRlZDk5YzgyOTg0ZTg2ODA1ODFjOGY0MWFhYWFhOTdmZDlkZWIzYjU3YmE4Y2M4MzAxZDdiMGRlZDgxMDI4NTM=
相关代码
PictureController代码
▼Java复制代码@RestController @RequestMapping("/picture") public class PictureController { @Resource private UserService userService; @Resource private PictureService pictureService; @PostMapping("/upload") @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) public BaseResponse<PictureVO> uploadPicture(@RequestPart("file") MultipartFile multipartFile, PictureUploadRequest pictureUploadRequest, HttpServletRequest request){ User loginUser = userService.getLoginUser(request); PictureVO pictureVO = pictureService.uploadPicture(multipartFile, pictureUploadRequest, loginUser); return ResultUtils.success(pictureVO); } }
PictureServiceImpl代码
▼Java复制代码@Service public class PictureServiceImpl extends ServiceImpl<PictureMapper, Picture> implements PictureService { @Resource private FileManager fileManager; @Override public PictureVO uploadPicture(MultipartFile multipartFile, PictureUploadRequest pictureUploadRequest, User loginUser) { // 校验登录用户 ThrowUtils.throwIf(loginUser == null, ErrorCode.NOT_LOGIN_ERROR); // 判断是新增还是更新图片 Long pictureId = null; if (pictureUploadRequest != null && pictureUploadRequest.getId() != 0) { // 更新 pictureId = pictureUploadRequest.getId(); } // 如果是更新, 查询数据库判断图片是否存在 if (pictureId != null){ boolean exists = this.lambdaQuery() .eq(Picture::getId, pictureId) .exists(); ThrowUtils.throwIf(!exists, ErrorCode.NOT_FOUND_ERROR); } // 上传图片到 COS // 根据用户id划分目录 String uploadPathPrefix = String.format("public/%s", loginUser.getId()); // 调用图片上传方法 UploadPictureResult uploadPictureResult = fileManager.uploadPicture(multipartFile, uploadPathPrefix); Picture picture = new Picture(); picture.setUrl(uploadPictureResult.getUrl()); picture.setName(uploadPictureResult.getPicName()); picture.setPicSize(uploadPictureResult.getPicSize()); picture.setPicWidth(uploadPictureResult.getPicWidth()); picture.setPicHeight(uploadPictureResult.getPicHeight()); picture.setPicScale(uploadPictureResult.getPicScale()); picture.setPicFormat(uploadPictureResult.getPicFormat()); picture.setUserId(loginUser.getId()); if (pictureId != null){ picture.setId(pictureId); picture.setEditTime(new Date()); } // 构建对象存储到数据库中 boolean save = this.saveOrUpdate(picture); ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR,"图片上传失败"); return PictureVO.objToVo(picture); } }
FileManager代码
▼text复制代码@Service @Slf4j public class FileManager { // 1 MB private static final long ONE_MB = 1024 * 1024; // 允许上传的文件后缀 private static final List<String> ALLOW_UPLOAD_SUFFIX = Arrays.asList("jpg", "jpeg", "png", "gif", "webp"); @Resource private CosClientConfig cosClientConfig; @Resource private CosManager cosManager; /** * 上传图片 * * @param multipartFile * @param uploadPathPrefix * @return */ public UploadPictureResult uploadPicture(MultipartFile multipartFile, String uploadPathPrefix) { // 校验图片 checkPicture(multipartFile); // 编辑图片上传地址(包括路径前缀和文件名,文件名修改为当前日期和uuid随机数,同时拼接上原文件后缀) String uuid = RandomUtil.randomString(8); String originalFilename = multipartFile.getOriginalFilename(); String updateFileName = String.format("%s/%s/%s", DateUtil.formatDate(new Date()), uuid, FileUtil.getSuffix(originalFilename)); String uploadPath = String.format("%s/%s", uploadPathPrefix, updateFileName); File file = null; // 上传图片 try { // 创建临时文件 file = File.createTempFile(uploadPath, null); // 上传图片 (根据修改后的路径) PutObjectResult putObjectResult = cosManager.putPictureObject(uploadPath, file); // 获取上传后的图片信息 ImageInfo imageInfo = putObjectResult.getCiUploadResult().getOriginalInfo().getImageInfo(); // 封装返回结果 (自定义返回结果) UploadPictureResult uploadPictureResult = new UploadPictureResult(); int width = imageInfo.getWidth(); int height = imageInfo.getHeight(); double scale = NumberUtil.round( width * 1.0 / height, 2).doubleValue(); uploadPictureResult.setUrl(uploadPath); uploadPictureResult.setPicName(updateFileName); uploadPictureResult.setPicSize(FileUtil.size(file)); uploadPictureResult.setPicWidth(width); uploadPictureResult.setPicHeight(height); uploadPictureResult.setPicScale(scale); uploadPictureResult.setPicFormat(imageInfo.getFormat()); return uploadPictureResult; } catch (Exception e) { log.error("图片上传到对象存储失败",e); throw new BusinessException(ErrorCode.SYSTEM_ERROR, "图片上传失败"); }finally { this.deleteTempFile(file); } // 封装返回结果 } /** * 校验文件 * * @param multipartFile */ private void checkPicture(MultipartFile multipartFile) { // 判断文件是否为空 ThrowUtils.throwIf(multipartFile == null, ErrorCode.PARAMS_ERROR, "文件不能为空"); // 1.校验文件大小 long fileSize = multipartFile.getSize(); ThrowUtils.throwIf(fileSize > ONE_MB * 2, ErrorCode.PARAMS_ERROR, "文件大小不能超过2M"); // 2.校验文件后缀 String fileSuffix = FileUtil.getSuffix(multipartFile.getOriginalFilename()); ThrowUtils.throwIf(!ALLOW_UPLOAD_SUFFIX.contains(fileSuffix), ErrorCode.PARAMS_ERROR, "不支持的文件类型"); } /** * 删除临时文件 * @param file */ private void deleteTempFile(File file) { if (file != null) { FileUtil.del(file); } try { // 删除临时文件 file.delete(); } catch (Exception e) { log.error("文件删除失败,文件地址:{}",file.getAbsolutePath(),e); } } } CosManager代码 ```js /** * 上传图片对象 * * @param key 唯一键 * @param file 文件 */ public PutObjectResult putPictureObject(String key, File file) { PutObjectRequest putObjectRequest = new PutObjectRequest(cosClientConfig.getBucket(), key, file); // 对图片进行处理(获取基本信息也是一种处理) PicOperations picOperations = new PicOperations(); // 1 表示返回原图信息 picOperations.setIsPicInfo(1); // 构造处理函数 putObjectRequest.setPicOperations(picOperations); return cosClient.putObject(putObjectRequest); }
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
学习完智能协同云图库项目后,想改造成springcloudalibaba架构的微服务项目,微服务划分如下:依赖服务:- 注册中心与配置中心: Nacos(负责服务注册发现以及各服务的动态配置管理)- 微服务网关(yunpic-backend-gateway): Gateway 聚合所有接口,统一接收处理前端请求,负责路由转发、鉴权与限流公共模块:- common 公共模块(yunpic-backe
4
云图库-以图搜图失效解决
7
个人博客
4
我在做云图库项目到部署上线阶段时,前后端已经成功部署到宝塔云上,我也能成功通过我的域名正常访问云图库,注册新账户也是注册成功且远程数据库也有信息,但是用已有的账号登录总是显示系统错误。我看了下我的redis密码正确且服务是正常运行请问有人遇到过同样的问题吗?
3
智能协同云图库-进入编辑报错解决
4
