Cara menyandikan gambar base64 di linux bash / shell

104

Saya mencoba base64 menyandikan gambar dalam skrip shell dan memasukkannya ke dalam variabel:

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

Saya juga mencoba sesuatu seperti ini:

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

tapi tetap tidak berhasil.

Saya ingin melakukan sesuatu seperti ini:

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

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

tapi masih belum berhasil.

dasbor00
sumber

Jawaban:

154

Anda perlu menggunakan catuntuk mendapatkan konten dari file bernama 'DSC_0251.JPG', bukan nama file itu sendiri.

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

Namun, base64dapat membaca dari file itu sendiri:

test=$( base64 DSC_0251.JPG )
chepner
sumber
dengan kucing itu berhasil, terima kasih banyak, kawan. Saya tahu bahwa itu dapat membaca dari file, tetapi masih memiliki masalah untuk menyimpannya dalam variabel jadi test = "$ (cat DSC_0251.JPG | base64)" berfungsi untuk saya.
dasbor00
3
Masalah apa? Kedua perintah di atas harus menghasilkan hasil yang identik, kecuali yang pertama adalah penggunaan cat yang tidak berguna .
chepner
kamu benar. Ini yang harus saya lakukan$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)";
dasbor00
19
cat vlc.jpg | base64 -w 0 - jika seseorang menginginkan keluaran sebagai string untuk disalin dan ditempel.
1
Ada apa dengan base64 DSC_0251.JPG? Tidak perlu menjalankan melalui catfilter ketika program mengambil file sebagai argumen ( base64 [OPTIONS] [FILE])
Eric
61

Hasil garis tunggal:

base64 -w 0 DSC_0251.JPG

Untuk HTML:

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

Sebagai file:

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

Dalam variabel:

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

Dalam variabel untuk HTML:

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

Membuat Anda mendapatkan kembali data yang dapat dibaca:

base64 -d DSC_0251.base64 > DSC_0251.JPG 

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

Eduardo Cuomo
sumber
-w 0parameter ini sangat penting dalam banyak kasus. Ex. Jika kita menjalankan langsung ke baris perintah. Terima kasih!
Jayesh Dhandha
4
BTW di OSX yang saya dapatkan base64: invalid option -- w. Saat itu dihapus, saya mengerti Unable to open '0': No such file or directory. Lihat ini sebagai gantinya.
coblr
38

Ada perintah Linux untuk itu: base64

base64 DSC_0251.JPG >DSC_0251.b64

Untuk menetapkan hasil ke penggunaan variabel

test=`base64 DSC_0251.JPG`
David Jashi
sumber
7
base64 -d DSC_0251.b64 > DSC_0251.JPGdapat mengembalikan data yang dapat Anda baca.
Alston
Jawaban ini juga berfungsi untuk file xml dan csv.
Lucas Andrade
3

Base 64 untuk 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
sumber
1

Untuk base64 dan meletakkannya di clipboard Anda:

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

Jika Anda membutuhkan masukan dari termial, coba ini

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

-n opsi tidak akan memasukkan karakter "\ n" ke perintah base64.

Victor Choy
sumber