使用Apisauce获取API图片:二进制转Base64显示问题咨询
兄弟,我之前也碰到过一模一样的问题!你的核心问题是HTTP请求默认把响应当成字符串解析,导致二进制图片数据被乱码处理,根本没法转成正确的Base64。下面给你一步步解决的方案:
1. 修改请求配置,指定响应类型为Blob
你现在的请求没有指定响应类型,axios(或者你封装的http库)默认会把响应解析成JSON/字符串,这就会把二进制图片数据搞成乱码。所以第一步要给请求加上responseType: 'blob'配置:
get: fileId => { // 关键就是加上responseType配置,让后端返回的二进制数据被正确处理成Blob对象 return http.get(`/files/${fileId}`, { responseType: 'blob' }); },
如果你的http封装底层用的是fetch,那配置是{ headers: {}, body: null, ..., responseType: 'blob' },原理是一样的——告诉浏览器不要把响应当成字符串解析,保留原始二进制格式。
2. 将Blob转换为Base64并展示
拿到正确的Blob对象后,我们可以用FileReader来把它转成Base64格式的Data URL,这样就能直接在img标签里展示了:
用Promise/then写法:
// 调用你的文件接口 yourFileApi.get('目标文件ID') .then(response => { const imageBlob = response.data; // 创建FileReader实例 const reader = new FileReader(); // 读取完成后的回调 reader.onload = function(e) { // e.target.result就是Base64格式的Data URL const base64ImageUrl = e.target.result; // 把这个URL赋值给img标签的src属性 document.getElementById('your-image-element').src = base64ImageUrl; }; // 以Data URL的形式读取Blob reader.readAsDataURL(imageBlob); }) .catch(error => { console.error('获取图片失败:', error); });
用async/await写法(更简洁):
async function loadAndShowImage(fileId) { try { const response = await yourFileApi.get(fileId); const imageBlob = response.data; // 用Promise封装FileReader的读取过程 const base64ImageUrl = await new Promise((resolve) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result); reader.readAsDataURL(imageBlob); }); // 展示图片 document.getElementById('your-image-element').src = base64ImageUrl; } catch (error) { console.error('加载图片出错:', error); } } // 调用函数 loadAndShowImage('目标文件ID');
验证一下
你可以在拿到response后打印console.log(response.data instanceof Blob),如果返回true,说明请求配置已经生效,Blob对象是正确的,接下来转Base64就不会有问题了。
内容的提问来源于stack exchange,提问作者锟給锟絊锟斤拷:锟斤拷锟绞�锟�b[锟絤锟疥仚锟斤拷X锟絕讵锟絯=锟�锟斤拷锟絑锟紺锟�M锟斤拷锟斤拷锟斤拷锟斤拷W=锟斤拷锟斤拷:锟絲锟絕&K`锟斤拷锟斤拷%锟斤拷}锟斤拷锟�锟斤拷j锟�l锟斤拷Z锟絊锟絜锟斤拷z锟�锟斤拷-锟斤拷V2锟斤拷K锟缴�S锟斤拷mYn锟�锟�锟斤拷锟斤拷锟絋< ]^锟紽锟絨3锟結惜m锟斤拷锟斤拷锟絣锟絴锟絔U锟节憋拷锟斤拷锟斤拷锟斤拷%锟絜褎-c+#IG锟絒叱锟絣锟斤拷锟�:锟絀锟�锟�$锟斤拷液锟�;锟斤拷<锟終\锟斤拷锟絀6锟斤拷锟斤拷锟斤拷锟斤拷锟絵巍锟斤拷@锟斤拷锟斤拷锟斤拷7越锟紷锟絢Aq锟斤拷锟�锟斤拷G蜆锟斤拷锟斤拷谈r锟斤拷!锟斤拷吆锟斤拷锟较�锟斤拷锟斤拷$O锟�锟絚< 锟�Y锟斤拷""7战锟絶锟斤拷xsq.sk锟斤拷锟斤拷t锟斤拷锟斤拷锟斤拷*M锟�GM锟�锟�锟斤拷j锟斤拷锟斤拷h锟斤拷锟斤拷 锟教岋拷锟絣锟絒锟斤拷锟絞锟斤拷S锟�锟斤拷VFF=nv锟斤拷e锟斤拷锟斤拷锟経 锟�锟斤拷<&%8sc锟終F锟斤拷锟絓锟斤拷锟�v;锟絰 锟斤拷锟�锟�锟絎锟筋5锟結锟�_;锟斤拷锟皆筹拷3锟斤拷锟斤拷b锟斤拷瞢锟�2锟給d锟斤拷锟�O>锟斤拷m锟斤拷锟斤拷锟絘锟絶锟絆锟紾RD锟酵庯拷fYsQ锟紷锟斤拷锟斤拷tn锟絶M锟斤拷e锟劫�锟�!锟紼锟斤拷挚锟�锟斤拷锟�锟酵Wd锟絚锟�$锟絆""锟絢锟斤拷锟斤拷锟斤拷锟斤拷锟�锟斤拷锟絜锟捷憋拷锟絣s锟�锟斤拷e锟斤拷锟�锟絛锟斤拷??锟杰璊 锟�锟秸岋拷6锟斤拷Uk7锟斤拷m锟斤拷:锟紾锟絖锟絔[锟絵%锟絕SM.锟斤拷锟終`锟斤拷[锟�锟�贸?锟絢腔锟皆儅_Y锟斤拷`@锟�~锟斤拷锟�锟紹锟紷Sh锟�锟絎锟斤拷锟斤拷锟斤拷锟斤拷%u锟斤拷mq锟斤拷'n锟絘<锟津繓拷Gi锟斤拷Q锟� ?锟斤拷y锟絀 锟斤拷5锟斤拷锟斤拷锟絵锟絥锟斤拷锟斤拷锟斤拷锟斤拷q1锟斤拷锟絔y锟紿锟�gt;锟斤拷 锟斤拷""x锟斤拷D锟斤拷锟斤拷锟�锟�w锟斤拷锟斤拷锟絖T锟斤拷锟斤拷鞃癴>锟紾锟斤拷)/+I.锟�锟斤拷锟斤拷锟斤拷0Photoshop 3.08BIM%8BIM: printOutputPstSboolInteenumInteClrmprintSixteenBitbool printerNameTEXTCanon iR1022i PCL6printProofSetupObjcNastaven锟�n锟絫isku鈫祊roofSetupBltnenum builtinProof proofCMYK8BIM;-printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@o锟紾rn doub@o锟紹l doub@o锟紹rdTUntF#RltBld UntF#RltRsltUntF#Rlt@锟斤拷 鈫祐ectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@YcropWhenPrintingboolcropRectBottomlong cropRectLeftlong cropRectRightlong cropRectToplong8BIM锟�+锟斤拷+锟斤拷8BIM&?锟�BIM Z8BIM8BIM锟�8BIM'鈫�BIM锟紿/fflff/ff锟斤拷锟�Z5-8BIM锟絧锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷8BIM8BIM 8BIM08BIM-8BIM@@8BIM8BIM?b'foto2'bnullboundsObjcRct1Top longLeftlongBtomlongbRghtlong'slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum鈫礒SliceTypeImg boundsObjcRct1Top longLeftlongBtomlongbRghtlong'urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong鈫祃eftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?锟�BIM8BIM8BIM 锟紾U锟紾锟�锟斤拷锟斤拷锟�Adobe_CM锟斤拷鈥锟�锟�锟斤拷锟介锟終5VL锟斤拷锟斤拷D锟斤拷锟斤拷$QP锟斤拷锟�吆x锟絲Pm锟�pbhqO锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷J锟紿b锟斤拷锟絑锟斤拷?锟絎锟絵}锟�锟絖锟絒锟絑锟斤拷锟絴VJ-锟絏3锟�锟紼IO锟斤拷锟斤拷 )锟斤拷锟�)锟統<q锟�\Z锟�锟斤拷锟斤拷锟�u W锟絅锟斤拷Xt锟斤拷锟絓锟� r锟組锟絀锟斤拷U锟斤拷蓹锟斤拷茦S锟絑锟�葨锟�iH

