HTTP通过base64图片上传遇到的问题

​在做开放接口的时候,遇到个问题就是如何通过HTTP上传一个图片,考虑到接口的传输只支持json(API程序的限制),所以优先考虑前端先将图片转成base64字符串,再上传字符串给后端

​后端在做上传文件到服务器时,需要用到文件流(inputstream),所以这也可以考虑两种方式,一种是直接上传,另外一种是先将base64转成图片保存到临时路径下,再通过保存的图片拿到文件流。下面具体看下两种获取流的方式的实现:

方式一:直接上传到服务器(据说没有第二种方式可靠,个人觉得效率会高一些,期间减少了流的操作)

实现思路:将base64转成bytes数组,bytes数组再转成输入流;

// 代码实现
//1.将字符串去掉头部信息image转换为byte数组,file为完整的base64字符串
byte[] bytes = new BASE64Decoder().decodeBuffer(file.trim().split(",")[1]);
for (int i = 0; i < bytes.length; ++i) {
    if (bytes[i] < 0) {// 调整异常数据
        bytes[i] += 256;
    }
}
//2.转化为输入流
InputStream imageStream = new ByteArrayInputStream(bytes);

方式二:先缓存到临时路径(事后需要删除缓存的图片)

// 代码实现
// 1.调用自己写的帮助类,保存。tempDir为指定的保存路径,包含文件名和后缀
boolean isSave = Base64Convert.generateImage(file, tempDir);
// 2.通过路径找到文件生成一个文件流
InputStream imageStream = new FileInputStream(tempDir);

在开发过程中遇到的坑:上传文件(图片)成功,但是size为0,一开始一直没有找到问题所在,还以为是自己的实现方式有问题,后来经过排查,发现原来是自己调用了一次ImageIO.read(stream),将流给使用了(流只能消费一次),所以后面的流就变了。

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

RomanticMachine

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值