Como codificar imagem em base64 em linux bash / shell

102

Estou tentando codificar uma imagem em base64 em um script de shell e colocá-la na variável:

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

Eu também tentei algo assim:

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

mas ainda sem sucesso.

Eu quero fazer algo assim:

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

Encontrei este http://www.zzzxo.com/q/answers-bash-base64-encode-script-not-encoding-right-12290484.html

mas ainda não teve sucesso.

dash00
fonte

Respostas:

152

Você precisa usar catpara obter o conteúdo do arquivo denominado 'DSC_0251.JPG', em vez do próprio nome do arquivo.

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

No entanto, base64pode ler do próprio arquivo:

test=$( base64 DSC_0251.JPG )
chepner
fonte
com o gato funciona, ótimo, muito obrigado cara. Eu sei que ele pode ler o arquivo, mas ainda tem problemas para armazená-lo na variável, então test = "$ (cat DSC_0251.JPG | base64)" funciona para mim.
dash00
3
Que problemas? Os dois comandos acima devem produzir resultados idênticos, exceto que o primeiro é um uso inútil de cat .
chepner
você está certo. Isto é o que devo fazer$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
19
cat vlc.jpg | base64 -w 0 - caso alguém queira a saída como string para copiar e colar.
1
O que há de errado base64 DSC_0251.JPG? Não há necessidade de passar pelo catfiltro quando o programa pega um arquivo como argumentos ( base64 [OPTIONS] [FILE])
Eric
60

Resultado de linha única:

base64 -w 0 DSC_0251.JPG

Para HTML:

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

Como arquivo:

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

Na variável:

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

Em variável para HTML:

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

Obtenha seus dados legíveis de volta:

base64 -d DSC_0251.base64 > DSC_0251.JPG 

Veja: http://www.greywyvern.com/code/php/binary2base64

Eduardo cuomo
fonte
-w 0este parâmetro é muito importante em muitos casos. Ex. Se estivermos executando diretamente na linha de comando. Obrigado!
Jayesh Dhandha
4
BTW no OSX, estou conseguindo base64: invalid option -- w. Quando é removido, eu entendo Unable to open '0': No such file or directory. Veja isso .
coblr
38

Existe um comando Linux para isso: base64

base64 DSC_0251.JPG >DSC_0251.b64

Para atribuir o resultado ao uso variável

test=`base64 DSC_0251.JPG`
David Jashi
fonte
7
base64 -d DSC_0251.b64 > DSC_0251.JPGpode obter dados legíveis de volta.
Alston
Essa resposta funcionou para arquivos xml e csv também.
Lucas Andrade
3

Base 64 para html:

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

Para base64 e colocá-lo em sua área de transferência:

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

Se você precisar de informações do termial, tente isto

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

-n opção não irá inserir o caractere "\ n" no comando base64.

Victor Choy
fonte