关于Base64String与图片互转中图片无法正常显示的问题

开发中遇到的一个问题,原始需求需要把图片转成base64String上传到接口,接口平台将String写入到sftp,

后续再从sftp下载图片。

问题:上传的图片下载下来打开报错。

可能原因1:图片转成base64String的时候带了前缀

src="https://img-blog.csdnimg.cn/2022010618190097700.jpeg"
如果是这种需要将"data:image/jpeg;base64,"替换成空

后经测试发现,直接用图片转base64String发现未带前缀。。。。。。。。

可能原因2:图片转存时不是通过Base64.Decode(String)得到的byte数组。

最终问题:服务器转存图片到sftp的时候,没有做decode而是直接用String.getByte()得到byte数组。

解决办法:接口接收到上送的String时先用base64进行decode,得到byte数组。此时的数组时可以直接写入到图片的。

test代码:

	/**
	 * 图片转base64字符串
	 * @param filePath
	 * @return
	 */
	public static String getFile(String filePath) {
        byte[] data = null;
        FileInputStream is = null;
        try {
            is = new FileInputStream(new File(filePath));
            data = new byte[is.available()];
            is.read(data);
            return new String(Base64.encode(data));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != is) {
                try {
                    is.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return "";
    }
    //测试方法
	public static void main(String[] args) throws IOException {
		String fileContent=getFile("c:\\users\\jugg\\desktop\\222.jpg");
		System.out.println(fileContent);
		File file1=new File("c:\\users\\jugg\\desktop\\tmp123");
		File file2=new File("c:\\users\\jugg\\desktop\\tmp456");
		byte[] decoByte=Base64.decode(fileContent);
		for (int i = 0; i < decoByte.length; ++i) {
		       if (decoByte[i] < 0) {
		    	   decoByte[i] += 256;
		       }
		}
		FileUtils.writeByteArrayToFile(file1, decoByte);
		InputStream io=new ByteArrayInputStream(fileContent.getBytes());
		byte[] data=new byte[io.available()];
		io.read(data);
		FileUtils.writeByteArrayToFile(file2, data);
	}

实验结果:直接在生成的文件后面加jpg后缀发现,前者(tmp123.jpg)能正常打开。后者(tmp456.jpg)图片损坏,无法正常打开。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值