我需要将我的图片转换为Base64字符串,以便将图片发送到服务器。
是否有适用于此的JavaScript文件?否则,我该如何进行转换?
我需要将我的图片转换为Base64字符串,以便将图片发送到服务器。
是否有适用于此的JavaScript文件?否则,我该如何进行转换?
尝试使用以下代码:
对于文件上传变更事件,请调用此函数:
$("#fileproof").on('change', function () {
readImage($(this)).done(function (base64Data) { $('#<%=hfimgbs64.ClientID%>').val(base64Data); });
});
function readImage(inputElement) {
var deferred = $.Deferred();
var files = inputElement.get(0).files;
if (files && files[0]) {
var fr = new FileReader();
fr.onload = function (e) {
deferred.resolve(e.target.result);
};
fr.readAsDataURL(files[0]);
} else {
deferred.resolve(undefined);
}
return deferred.promise();
}
如果你遇到跨域错误,可以使用一个名为cors-fix的简单代理来在服务器上加载图像并将其作为缓冲区数组返回。
因此,我们可以使用 fetch 获取图像数据,并使用 filereader 将其转换为 dataUrl,正如 @HaNdTriX 所描述的那样。
function toDataUrl(url) {
fetch(`https://cors-fix.web.app/v1?url=${url}`)
.then(data => data.blob().then(blob => {
const reader = new FileReader();
reader.onloadend = () => {
console.log(reader.result);
};
reader.onerror = () => {
console.log('reader error');
};
reader.readAsDataURL(blob);
}));
}
document.querySelector('input').onchange = e => {
const fr = new FileReader()
fr.onloadend = () => document.write(fr.result)
fr.readAsDataURL(e.target.files[0])
}
<input type="file">
需要使用读取器将blob转换为base64,我更喜欢使用async-await语法,因此选择将读取逻辑提取到帮助程序中,如下所示:
//* Convert resBlob to base64
export const blobToData = (blob: Blob) => {
return new Promise((resolve) => {
const reader = new FileReader()
reader.onloadend = () => resolve(reader.result)
reader.readAsDataURL(blob)
})
}
并在主代码中使用await调用它:
//* Convert resBlob to dataUrl and resolve
const resData = await blobToData(resBlob)
假设您正在浏览器中进行此操作:
使用 await:
import axios from 'axios'
const response = await axios.get(url, { responseType: 'blob' });
return window.URL.createObjectURL(response.data);
使用 Promise
import axios from 'axios'
const response = await axios.get(url, { responseType: 'blob' })
.then((response) => {
const dataUrl = window.URL.createObjectURL(response.data);
// do something with your url
});
const arrayBufferToBase64 = (arrayBuffer) =>
Buffer.from(arrayBuffer).toString("base64");
const arrayBufferToBase64 = (arrayBuffer) =>
btoa(String.fromCodePoint(...new Uint8Array(arrayBuffer)));
ArrayBuffer
对象?以下是一些示例: // from `fetch`
const arrayBuffer = await fetch('...').then(res => res.arrayBuffer())
// from `File | Blob` object
const arrayBuffer = await fileOrBlob.arrayBuffer()
// from `axios`
const arrayBuffer = await axios.request({ responseType: "arraybuffer" }).then({ data } => data)
//call like this
const convertedFile = await imageToBase64(fileObj);
console.log("convertedFile",convertedFile);
//this is the required function
async function imageToBase64(image) {
const reader = new FileReader();
reader.readAsDataURL(image);
const data= await new Promise((resolve, reject) => {
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
});
return data;
}
export default imageToBase64;
你也可以通过以下方式仅提取URL的base-64部分:
var Base64URL = canvas.toDataURL('image/webp')
var Base64 = Base64URL.split(",")[1] //Returns the base64 part