Jak kodować obraz base64 w linux bash / shell

105

Próbuję zakodować base64 obraz w skrypcie powłoki i umieścić go w zmiennej:

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

Próbowałem też czegoś takiego:

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

ale nadal bez sukcesu.

Chcę zrobić coś takiego:

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

Znalazłem to http://www.zzzxo.com/q/answers-bash-base64-encode-script-not-encoding-right-12290484.html

ale nadal nie odniosły sukcesu.

dash00
źródło

Odpowiedzi:

157

Musisz użyć, cataby pobrać zawartość pliku o nazwie „DSC_0251.JPG”, a nie samą nazwę pliku.

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

Jednak base64można odczytać z samego pliku:

test=$( base64 DSC_0251.JPG )
Chepner
źródło
z kotem to działa, wielkie dzięki bardzo stary. Wiem, że może czytać z pliku, ale nadal ma problemy z przechowywaniem go w zmiennej, więc test = "$ (cat DSC_0251.JPG | base64)" działa dla mnie.
dash00
3
Jakie problemy? Dwie powyższe komendy powinny dawać identyczne wyniki, z wyjątkiem tego, że pierwsza to bezużyteczne użycie cat .
chepner
masz rację. Oto, co powinienem zrobić$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 - na wypadek, gdyby ktoś chciał wydrukować jako ciąg do skopiowania i wklejenia.
1
Co jest nie tak base64 DSC_0251.JPG? Nie ma potrzeby przechodzenia przez catfiltr, gdy program przyjmuje plik jako arguments ( base64 [OPTIONS] [FILE])
Eric,
62

Wynik w jednym wierszu:

base64 -w 0 DSC_0251.JPG

Dla HTML:

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

Jako plik:

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

W zmiennej:

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

W zmiennej dla HTML:

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

Odzyskaj czytelne dane:

base64 -d DSC_0251.base64 > DSC_0251.JPG 

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

Eduardo Cuomo
źródło
-w 0ten parametr jest bardzo ważny w wielu przypadkach. Dawny. Jeśli uruchamiamy bezpośrednio w wierszu poleceń. Dzięki!
Jayesh Dhandha
4
BTW na OSX, dostaję base64: invalid option -- w. Kiedy zostanie usunięty, dostaję Unable to open '0': No such file or directory. Zobacz to zamiast tego .
coblr
38

Jest do tego polecenie Linuksa: base64

base64 DSC_0251.JPG >DSC_0251.b64

Aby przypisać wynik do zmiennej użyj

test=`base64 DSC_0251.JPG`
David Jashi
źródło
7
base64 -d DSC_0251.b64 > DSC_0251.JPGmożna odzyskać czytelne dane.
Alston
Ta odpowiedź działała również w przypadku plików xml i csv.
Lucas Andrade
3

Base 64 dla 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
źródło
1

Aby go base64 i umieścić w schowku:

file="test.docx"
base64 -w 0 $file  | xclip -selection clipboard
DavidBu
źródło
0

Jeśli potrzebujesz danych wejściowych z terminala, spróbuj tego

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

-n opcja nie wprowadzi znaku "\ n" do polecenia base64.

Victor Choy
źródło