Comment encoder une image en base64 dans Linux Bash / Shell

104

J'essaie d'encoder une image en base64 dans un script shell et de la mettre en variable:

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

J'ai aussi essayé quelque chose comme ça:

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

mais toujours sans succès.

Je veux faire quelque chose comme ça:

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

J'ai trouvé ceci http://www.zzzxo.com/q/answers-bash-base64-encode-script-not-encoding-right-12290484.html

mais n'ont toujours pas eu de succès.

dash00
la source

Réponses:

154

Vous devez utiliser catpour obtenir le contenu du fichier nommé 'DSC_0251.JPG', plutôt que le nom de fichier lui-même.

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

Cependant, base64peut lire à partir du fichier lui-même:

test=$( base64 DSC_0251.JPG )
chepner
la source
avec un chat ça marche, merci beaucoup mec. Je sais qu'il peut lire un fichier, mais il a toujours des problèmes pour le stocker dans la variable donc test = "$ (cat DSC_0251.JPG | base64)" fonctionne pour moi.
dash00
3
Quels problèmes? Les deux commandes ci-dessus devraient produire des résultats identiques, sauf que la première est une utilisation inutile de cat .
chepner
vous avez raison. Voici ce que je dois faire$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 - au cas où quelqu'un voudrait une sortie sous forme de chaîne à copier et coller.
1
Quel est le problème avec base64 DSC_0251.JPG? Il n'est pas nécessaire de parcourir le catfiltre lorsque le programme prend un fichier comme arguments ( base64 [OPTIONS] [FILE])
Eric
61

Résultat sur une seule ligne:

base64 -w 0 DSC_0251.JPG

Pour HTML:

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

En tant que fichier:

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

En variable:

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

En variable pour HTML:

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

Récupérez vos données lisibles:

base64 -d DSC_0251.base64 > DSC_0251.JPG 

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

Eduardo Cuomo
la source
-w 0ce paramètre est très important dans de nombreux cas. Ex. Si nous exécutons directement dans la ligne de commande. Merci!
Jayesh Dhandha
4
BTW sur OSX je reçois base64: invalid option -- w. Quand il est supprimé, je reçois Unable to open '0': No such file or directory. Voyez plutôt ceci .
coblr le
38

Il existe une commande Linux pour cela: base64

base64 DSC_0251.JPG >DSC_0251.b64

Pour affecter le résultat à l'utilisation de la variable

test=`base64 DSC_0251.JPG`
David Jashi
la source
7
base64 -d DSC_0251.b64 > DSC_0251.JPGpeut vous récupérer des données lisibles.
Alston
Cette réponse fonctionnait également pour les fichiers xml et csv.
Lucas Andrade le
3

Base 64 pour 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
la source
1

Pour le baser64 et le mettre dans votre presse-papiers:

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

Si vous avez besoin de l'aide de termial, essayez ceci

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

-n L'option n'entrera pas le caractère "\ n" dans la commande base64.

Victor Choy
la source