Как base64 закодировать изображение в linux bash / shell

106

Я пытаюсь base64 закодировать изображение в сценарии оболочки и поместить его в переменную:

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

но все еще безуспешно.

тире00
источник

Ответы:

158

Вам нужно использовать catдля получения содержимого файла с именем «DSC_0251.JPG», а не самого имени файла.

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

Однако base64можно читать из самого файла:

test=$( base64 DSC_0251.JPG )
Чепнер
источник
с кошкой все работает, большое спасибо, чувак. Я знаю, что он может читать из файла, но у него все еще есть проблемы с сохранением его в переменной, поэтому test = "$ (cat DSC_0251.JPG | base64)" у меня работает.
dash00 04
3
Какие проблемы? Две приведенные выше команды должны дать одинаковые результаты, за исключением того, что первая - бесполезное использование cat .
chepner 04
Ты прав. Вот что я должен делать$RESPONSE="$(curl -v -X POST -d '{"image":`base64|$DIR$IMAGE`,"location":$LOCATION,"time_created":$TIMECREATED}' -H 'Content-type: text/plain; charset=UTF8' --max-time 180 -s $URL)";
dash00 04
20
cat vlc.jpg | base64 -w 0 - в случае, если кто-то хочет вывод в виде строки для копирования и вставки.
1
Что не так base64 DSC_0251.JPG? Нет необходимости пропускать catфильтр, когда программа принимает файл в качестве аргументов ( base64 [OPTIONS] [FILE])
Эрик,
62

Результат в одну строку:

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)"

Верните вам читаемые данные:

base64 -d DSC_0251.base64 > DSC_0251.JPG 

См .: http://www.greywyvern.com/code/php/binary2base64

Эдуардо Куомо
источник
-w 0этот параметр очень важен во многих случаях. Ex. Если мы запускаемся прямо в командную строку. Благодарность!
Jayesh Dhandha 05
4
Кстати, на OSX я получаю base64: invalid option -- w. Когда его снимают, я получаю Unable to open '0': No such file or directory. Смотрите это вместо этого.
coblr
38

Для этого есть команда Linux: base64

base64 DSC_0251.JPG >DSC_0251.b64

Чтобы присвоить результат переменной, используйте

test=`base64 DSC_0251.JPG`
Дэвид Джаши
источник
7
base64 -d DSC_0251.b64 > DSC_0251.JPGможет вернуть вам читаемые данные.
Alston
Этот ответ также работал с файлами xml и csv.
Лукас Андраде,
3

База 64 для html:

file="DSC_0251.JPG"
type=$(identify -format "%m" "$file" | tr '[A-Z]' '[a-z]')
echo "data:image/$type;base64,$(base64 -w 0 "$file")"
Андрей Изман
источник
1

Чтобы base64 его и поместил в буфер обмена:

file="test.docx"
base64 -w 0 $file  | xclip -selection clipboard
DavidBu
источник
0

Если вам нужен ввод от терминала, попробуйте это

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

-n опция не вводит символ "\ n" в команду base64.

Виктор Чой
источник