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.

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 )

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


-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`

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

1

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

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.