springboot ResponseEntity<byte[]> 下载文件 byte 都变成base64

本文介绍如何在SpringBoot中配置消息转换器,解决文件的byte数据被错误转换为JSON格式的问题。通过自定义CustMvcConfig类,添加ByteArrayHttpMessageConverter和FastJsonHttpMessageConverter,确保byte数据和JSON数据正确处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

因为spring boot消息转换器 ,全部将数据转换为json格式,包括文件的byte数据

关于spring boot 的消息转换器见:https://www.jianshu.com/p/ffe56d9553fd

解决方案如下:

 

@Configuration
public class CustMvcConfig extends WebMvcConfigurationSupport {
    @Autowired
    private FastJsonHttpMessageConverter fastJsonConverter;


    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters);
        converters.add(new ByteArrayHttpMessageConverter()); // ByteArrayHttpMessageConverter 必须加在前面,处理byte数据
        converters.add(fastJsonConverter);// fastjsonConverter 必须加在后面 处理json数据
    }
}

  

转载于:https://www.cnblogs.com/pangguoming/p/10899604.html

@PostMapping("/uploadPmPhoto") @ApiOperation("拍照上传图片进行识别") @AutoLog(appName = ApiConst.TRACK_IN,moduleName = "uploadPhoto") public R<ImageReturnDto> uploadPmPhoto(HttpServletRequest request) { log.info("上传图片进行识别:" + CurrentUser.getUser().getWorkNo()); ImageReturnDto imageReturnDto = new ImageReturnDto(); MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest)request; MultiValueMap<String, MultipartFile> fileMap = multipartHttpServletRequest.getMultiFileMap(); MultipartFile file = fileMap.getFirst("file"); try { if(ocrUrl2Flag){ String originalFilename = file.getOriginalFilename(); // 生成临时文件 String tempPath = System.getProperty("java.io.tmpdir"); File tempFile = new File(tempPath + originalFilename); InputStream inputStream = null; if (!tempFile.exists()) { inputStream = file.getInputStream(); Files.copy(inputStream, tempFile.toPath()); } FileSystemResource resource = new FileSystemResource(tempFile); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); headers.set("Accept-Charset", "UTF-8"); MultiValueMap<String,Object> body = new LinkedMultiValueMap<>(); body.add("file",resource); HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(body, headers); ResponseEntity<String> responseEntity = restTemplate.exchange(ocrUrl2, HttpMethod.POST, httpEntity, new ParameterizedTypeReference<String>() { }); Files.delete(tempFile.toPath()); if(responseEntity.getStatusCodeValue() == 200){ JSONObject jsonObject = JSONObject.parseObject(responseEntity.getBody()); imageReturnDto.setOCRText(jsonObject.getString("processedOCRTexts")); imageReturnDto.setImageData(jsonObject.getString("imageData")); log.info("OCR识别结果:{}",jsonObject.getString("processedOCRTexts")); return R.success(imageReturnDto); }else{ log.error("OCR识别服务异常:{}", responseEntity); return R.fail("OCR识别服务异常"); } }else{ String imageOcrDto = multipartHttpServletRequest.getParameter("imageOcrDto"); ImageOcrDto imageOcrDtoNew = new ImageOcrDto(); String base64String = null; byte[] fileBytes = file.getBytes(); base64String = Base64.getEncoder().encodeToString(fileBytes); ImageOcrFileDto imageOcrFileDto = new ImageOcrFileDto(); imageOcrFileDto.setFileName("1.jpg"); imageOcrFileDto.setImageData(base64String); List<ImageOcrFileDto> imageOcrFileDtoList = new ArrayList<>(); imageOcrFileDtoList.add(imageOcrFileDto); imageOcrDtoNew = JSONObject.parseObject(imageOcrDto, ImageOcrDto.class); imageOcrDtoNew.setFiles(imageOcrFileDtoList); ImageOcrDto imageOcr = new ImageOcrDto(); BeanUtils.copyProperties(imageOcrDtoNew,imageOcr); String imageOcrNew = JSONObject.toJSONString(imageOcr); String sendPostJson = HttpRequestUtil.sendPost(ocrUrl,imageOcrNew); log.info("OCR识别结果:{}",sendPostJson); JSONObject jsonObject = JSONObject.parseObject(sendPostJson); JSONArray jsonObjectArray = jsonObject.getJSONArray("1.jpg"); if(!StringUtils.isEmpty(jsonObjectArray)){ StringBuilder stringBuilder = new StringBuilder(); for (int i=0;i<jsonObjectArray.size();i++) { JSONObject recipe = JSONObject.parseObject(jsonObjectArray.get(i).toString()); ImageOcrVO imageOcrVO = JSONObject.parseObject(String.valueOf(recipe), ImageOcrVO.class); if(org.apache.commons.lang.StringUtils.isNotBlank(imageOcrVO.getOCRText())){ stringBuilder.append(imageOcrVO.getOCRText()); } } imageReturnDto.setOCRText(stringBuilder.toString()); imageReturnDto.setImageData(base64String); return R.success(imageReturnDto); } else { R.fail("图片解析失败"); } } } catch (Exception e){ ErrorLogUtils.saveError(e); log.error("图片识别异常:{}",e.toString()); } return R.success(imageReturnDto); } 如何用postman测试如上方法
06-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值