我有一些关于fileinputjs的问题。图片' src是blob.But我想使用图像' src做某事。所以我使用readAsDataURL来获取base64。但是它有任何问题。
<script type="text/javascript">
$("#last").click(function(){
var blob=document.querySelector(".file-preview-image").src;
var reader = new FileReader(); //通过 FileReader 读取blob类型
reader.onload = function(){
this.result === dataURI; //base64编码
}
console.log(reader.readAsDataURL(blob));
})
</script>
然后有Uncaught TypeError: Failed to execute 'readAsDataURL' on 'FileReader': parameter 1 is not of type 'Blob'
。
答案 0 :(得分:9)
这里有很多误解。
blob
不是Blob,而是字符串,.file-preview-image
的网址。onload
回调中,如果结果等于未定义的变量dataURI
,则只需检查。那不会做任何事情。 console.log
readAsDataURL
对undefined
的调用,因为此方法是异步的(您必须在回调中调用console.log
)。 但是,因为我猜你所拥有的是object url(blob://
),那么你的解决方案是获取真实的Blob对象并将其传递给FileReader
,或者在画布上绘制此图像,然后调用其toDataURL
方法获取base64编码版本。
如果你能得到blob:
var dataURI;
var reader = new FileReader();
reader.onload = function(){
// here you'll call what to do with the base64 string result
dataURI = this.result;
console.log(dataURI);
};
reader.readAsDataURL(blob);
否则:
var dataURI;
var img = document.querySelector(".file-preview-image");
var canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
canvas.getContext('2d').drawImage(img, 0,0);
dataURI = canvas.toDataURL();
但请注意,对于后者,您必须等待图像实际上已加载,然后才能在画布上绘制。
此外,默认情况下,它会将您的图像转换为png版本。如果原始图片是JPEG格式,您还可以将image/jpeg
作为toDataURL('image/jpeg')
的第一个参数传递
如果图像是svg,那么使用<object>
元素会有另一种解决方案,但除非你真的需要它,否则我会把它留给另一个答案。