关于图片以base64传输,图片下载下来,ios乱码,andriod正常的问题

本文介绍了一种解决iOS客户端上传图片至服务器后显示损坏的问题。通过对前后端传输的Base64编码进行对比分析,发现iOS端多出了前缀数据,导致解码失败。通过简单修改后端代码移除该前缀解决了问题。

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

近期做了一个微信图片上传的功能,微信端是以base编码post提交到后台的,功能完成后,测试andriod机上传的图片下载下来是正常的,但是ios机上传的图片下载下来的图片是损坏的。我们先来看代码。

public void fileUpload(final HttpServletRequest request, final HttpServletResponse response) {
        String imgStr = request.getParameter("file");
        String fileName = request.getParameter("fileName");
        String fileType = request.getParameter("fileType");
        logger.info(">>>>>>>FileUploadController:imgStr:" + imgStr);
        logger.info(">>>>>>>FileUploadController:fileName:" + fileName + "fileType:" + fileType);
        Map<String, Object> resMap = new HashMap<String, Object>();
        if (StringUtils.isEmpty(imgStr)) {
            resMap.put("respCode", "0001");
            resMap.put("respMsg", "图片信息为空!");
            super.toJson(resMap, response);
            return;
        }
        String fssId = null;// 上传返回信息
        try {
            imgStr = imgStr.replace("data:image/jgp;base64,", "");
            byte[] decodeBuffer = Base64.decodeBase64(imgStr.getBytes());
            // 定义根路径
            String rootPath = request.getRealPath("/");
            String sourcePath = rootPath + "temp_upload/";
            File selfCheckingFolder = new File(sourcePath);// 创建文件夹
            if (!selfCheckingFolder.exists()) {
                selfCheckingFolder.mkdirs();
            }

            File sourceFile = new File(sourcePath + fileName + ".jpg");
            FileOutputStream outputStream = null;
            try {
                outputStream = FileUtils.openOutputStream(sourceFile);
                outputStream.write(decodeBuffer);
                outputStream.flush();
                fssId = FssFileClient.upload(APP_CODE, sourceFile);// 图片上传云存储
                logger.info(">>>>>>>FileUploadController:fssId:" + fssId);
            } catch (Exception e) {
                logger.error(">>>>>>>FileUploadController exception", e);
                resMap.put("respCode", "0003");
                resMap.put("respMsg", "字节转图片失败!");
                super.toJson(resMap, response);
                return;
            } finally {
                IoUtil.close(outputStream);
                if (sourceFile != null && sourceFile.exists()) {
                    sourceFile.delete();
                }
            }

        } catch (Exception e) {
            logger.error(">>>>>>>FileUploadController>>>图片上传失败", e);
            resMap.put("respCode", "0002");
            resMap.put("respMsg", "图片上传失败!");
            super.toJson(resMap, response);
            return;
        }
        // 将上传的资质信息保存入库
        CheckingFile checkingFile = new CheckingFile();
        checkingFile.setFileName(fileName);
        checkingFile.setFssid(fssId);
        checkingFile.setFileType(fileType);
        checkingFile.setCreateTime(new Date());
        checkingFileService.createCheckingFile(checkingFile);

        resMap.put("respCode", "0000");
        resMap.put("respMsg", "图片上传成功!");
        resMap.put("fssId", fssId);
        logger.info(">>>>>>>FileUploadController:resMap:" + resMap);
        super.toJson(resMap, response);
        return;
    }

再来看下前台传过来的base64编码:

(1)andriod手机传到后台的:


(2)ios端传到后台的:


比较传输到后台的base64编码数据,发现ios比andriod多传输了 data:image/jgp;base64,   

所以造成了无法解码,我们通过后台将data:image/jgp;base64, 替换掉就可以解决问题了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值