如何在 linux bash/shell 中对图像进行 base64编码

我尝试用 base64在 shell 脚本中编码一个图像,并将其放入变量:

test="$(printf DSC_0251.JPG | base64)"
echo $test
RFNDXzAyNTEuSlBH

我也试过这样的方法:

test=\`echo -ne DSC_0251.JPG | base64\`

但还是没有成功。

我想这样做:

curl -v -X POST -d '{"image":$IMAGE_BASE64,"location":$LOCATION,"time_created":$TIMECREATED}' -H 'Content-type: text/plain; charset=UTF8' http://192.168.1.1/upload

我找到了这个 http://www.zzzxo.com/q/answers-bash-base64-encode-script-not-encoding-right-12290484.html

但还是没有成功。

206820 次浏览

有一个 Linux 命令: 基地64

base64 DSC_0251.JPG >DSC_0251.b64

将结果分配给变量使用

test=`base64 DSC_0251.JPG`

您需要使用 cat来获取名为“ DSC _ 0251.JPG”的文件的 内容,而不是文件名本身。

test="$(cat DSC_0251.JPG | base64)"

但是,base64可以从文件本身读取:

test=$( base64 DSC_0251.JPG )

编码

在 Linux 上

单行结果:

base64 -w 0 DSC_0251.JPG

对于 HTML:

echo "data:image/jpeg;base64,$(base64 -w 0 DSC_0251.JPG)"

文件:

base64 -w 0 DSC_0251.JPG > DSC_0251.JPG.base64

变量:

IMAGE_BASE64="$(base64 -w 0 DSC_0251.JPG)"

HTML的变量:

IMAGE_BASE64="data:image/jpeg;base64,$(base64 -w 0 DSC_0251.JPG)"

在 OSX

OSX上,base64二进制文件是不同的,参数也是不同的。如果你想在 OSX上使用它,你应该删除 -w 0

单行结果:

base64 DSC_0251.JPG

对于 HTML:

echo "data:image/jpeg;base64,$(base64 DSC_0251.JPG)"

文件:

base64 DSC_0251.JPG > DSC_0251.JPG.base64

变量:

IMAGE_BASE64="$(base64 DSC_0251.JPG)"

HTML的变量:

IMAGE_BASE64="data:image/jpeg;base64,$(base64 DSC_0251.JPG)"

通用 OSX/Linux

作为外壳函数

@base64() {
if [[ "${OSTYPE}" = darwin* ]]; then
# OSX
if [ -t 0 ]; then
base64 "$@"
else
cat /dev/stdin | base64 "$@"
fi
else
# Linux
if [ -t 0 ]; then
base64 -w 0 "$@"
else
cat /dev/stdin | base64 -w 0 "$@"
fi
fi
}


# Usage
@base64 DSC_0251.JPG
cat DSC_0251.JPG | @base64

作为 Shell 脚本

创建包含以下内容的 base64.sh文件:

#!/usr/bin/env bash
if [[ "${OSTYPE}" = darwin* ]]; then
# OSX
if [ -t 0 ]; then
base64 "$@"
else
cat /dev/stdin | base64 "$@"
fi
else
# Linux
if [ -t 0 ]; then
base64 -w 0 "$@"
else
cat /dev/stdin | base64 -w 0 "$@"
fi
fi

让它可执行:

chmod a+x base64.sh

用法:

./base64.sh DSC_0251.JPG
cat DSC_0251.JPG | ./base64.sh

解码

返回可读数据:

base64 -d DSC_0251.base64 > DSC_0251.JPG

Html 的64基础:

file="DSC_0251.JPG"
type=$(identify -format "%m" "$file" | tr '[A-Z]' '[a-z]')
echo "data:image/$type;base64,$(base64 -w 0 "$file")"

以64为基数,把它放在你的剪贴板上:

file="test.docx"
base64 -w 0 $file  | xclip -selection clipboard

如果你需要从终端输入,试试这个

lc=`echo -n "xxx_${yyy}_iOS" |  base64`

-n选项将不会向 base64命令输入“ n”字符。

在使用 echo时请非常小心(这里有很多答案) ,因为它会在最后添加一个换行符,由于在编码字符串末尾添加了这些不祥的 额外的编码字符: Cg==,导致你的编码字符串失真(例如不正确的密码) :

例如,如果我们要对这个字符串进行编码:

$ MINIO_SECRET_KEY=VsarGnNADHGv

使用“ printf”时,它看起来像这样(正确) :

$ AWS_SECRET_ACCESS_KEY="$(printf $MINIO_SECRET_KEY | base64)" && echo $AWS_SECRET_ACCESS_KEY
VnNhckduTkFESEd2

... 但 echo是这样的(不正确) :

$ AWS_SECRET_ACCESS_KEY="$(echo $MINIO_SECRET_KEY | base64)" && echo $AWS_SECRET_ACCESS_KEY
VnNhckduTkFESEd2Cg==