Axios: Cara mengubah gambar dari get request ke base64

Dibuat pada 1 Nov 2016  ·  10Komentar  ·  Sumber: axios/axios

ada lib di luar sana di npm yang dapat melakukan ini?

axios.get('http://www.freeiconspng.com/uploads/profile-icon-9.png', {
   transformRequest: [function (data) {
       return data;
   }],
  transformResponse: [function (data) {
    return data;
  }],
});

Komentar yang paling membantu

jika Anda berada di simpul seperti saya dan Anda menggunakan v >= 6 , ada perubahan dan Anda harus menggunakan Buffer.from atau yang serupa.

function getBase64(url) {
  return axios
    .get(url, {
      responseType: 'arraybuffer'
    })
    .then(response => Buffer.from(response.data, 'binary').toString('base64'))
}

Referensi penyangga aman
new Buffer()' was deprecated since v6. Use 'Buffer.alloc()' or 'Buffer.from()' (use 'https://www.npmjs.com/package/safe-buffer' for '<4.5.0') instead

Semua 10 komentar

Saya pikir ini adalah pertanyaan untuk StackOverflow.

untuk siapa pun yang mencari solusi, saya memiliki kode berikut:

get('/getImg', {
    responseType: 'arraybuffer' 
})
.then(function(result) {
    console.log(_imageEncode(result.data))
})
function _imageEncode (arrayBuffer) {
    let u8 = new Uint8Array(arrayBuffer)
    let b64encoded = btoa([].reduce.call(new Uint8Array(arrayBuffer),function(p,c){return p+String.fromCharCode(c)},''))
    let mimetype="image/jpeg"
    return "data:"+mimetype+";base64,"+b64encoded
}

Ini adalah solusi kami, ini berfungsi seperti pesona

return axios.get('http://example.com/image.png', { responseType: 'arraybuffer' })
      .then((response) => {
        let image = btoa(
          new Uint8Array(response.data)
            .reduce((data, byte) => data + String.fromCharCode(byte), '')
        );
        return `data:${response.headers['content-type'].toLowerCase()};base64,${image}`;
      });

Alasan ini tidak akan berhasil adalah karena axios meletakkan semuanya di objek json. Karena Anda tidak dapat memasukkan biner ke dalam objek json, ia mengubahnya menjadi string yang memecah biner.

Ini bekerja sempurna untuk saya:

function getBase64(url) {
  return axios
    .get(url, {
      responseType: 'arraybuffer'
    })
    .then(response => new Buffer(response.data, 'binary').toString('base64'))
}

jika Anda berada di simpul seperti saya dan Anda menggunakan v >= 6 , ada perubahan dan Anda harus menggunakan Buffer.from atau yang serupa.

function getBase64(url) {
  return axios
    .get(url, {
      responseType: 'arraybuffer'
    })
    .then(response => Buffer.from(response.data, 'binary').toString('base64'))
}

Referensi penyangga aman
new Buffer()' was deprecated since v6. Use 'Buffer.alloc()' or 'Buffer.from()' (use 'https://www.npmjs.com/package/safe-buffer' for '<4.5.0') instead

@sean-hill Apakah Anda tahu mengapa itu tidak bisa mendapatkan token pertama dari gambar? Saya tidak melihat bagian data:image/png;base64, karena beberapa alasan, yang membuat data base64 tidak valid

ini bekerja untuk saya

function getImage(imageUrl) {
var options = {
    url: `${imageUrl}`,
    encoding: "binary"
};
  return new Promise(function (resolve, reject) {
    request.get(options, function (err, resp, body) {
        if (err) {
            reject(err);
        } else {
            var prefix = "data:" + resp.headers["content-type"] + ";base64,";
            var img = new Buffer(body.toString(), "binary").toString("base64");
            //  var img = new Buffer.from(body.toString(), "binary").toString("base64");
            var dataUri = prefix + img;
            resolve(dataUri);
        }
    })
})
}
function getImage(imageUrl) {
var options = {
    url: `${imageUrl}`,
    encoding: "binary"
};

    request.get(options, function (err, resp, body) {
        if (err) {
            reject(err);
        } else {
            var prefix = "data:" + resp.headers["content-type"] + ";base64,";
            var img = new Buffer(body.toString(), "binary").toString("base64");
           //  var img = new Buffer.from(body.toString(), "binary").toString("base64");
            var dataUri = prefix + img;
        }
    })
}
return axios.get('http://site.com/img.png', { responseType: 'arraybuffer' })
  .then(response => `data:${response.headers['content-type']};base64,${btoa(String.fromCharCode(...new Uint8Array(response.data)))}`);
return axios.get('http://site.com/img.png', { responseType: 'arraybuffer' })
  .then(response => `data:${response.headers['content-type']};base64,${btoa(String.fromCharCode(...new Uint8Array(response.data)))}`);

Versi simpul:

    return axios.get(url, { responseType: 'arraybuffer' }).then(res => {
      ;`data:${res.headers['content-type']};base64,${Buffer.from(String.fromCharCode(...new Uint8Array(res.data)), 'binary')
        .toString('base64')}`
    })

@voidpls
metode Anda menyebabkan kesalahan!
Uncaught RangeError: Maximum call stack size exceeded

itu disebabkan dari
toa(String.fromCharCode(...new Uint8Array(response.data)))

Anda dapat mencoba gambar ini
texture 4a95078a

Apakah halaman ini membantu?
0 / 5 - 0 peringkat