前端是另一个服务器,并向后端(Laravel)发出API调用,现在我想向前端发送一张图片,并使用vanilla js显示它(我不知道jQuery,我是后端开发人员)。
图片必须只提供给经过身份验证的用户,所以我想符号链接不是一个选择。
信息:
在前端,它只在浏览器开发工具的控制台中显示二进制内容,而且
抛出以下错误:
“DOMException:无法在“Window”上执行“btoa”:要编码的字符串包含Latin 1范围之外的字符。"
我可以看到我的图片成功上传到storage/path/to/pic。
Laravel控制器方法:
public function getAvatar(GetAvatarRequest $request): string
{
// some code...
//..
//..
return response()->file(base_path() . '/storage/app/images/avatars/1.jpeg', ['Content-Type' => 'Image/jpeg']);
// Also tried these but no luck
// return response()->download(Storage::disk('local')->get('images/avatars/1.jpeg'), 'name', ['Content-Type' => 'Image/jpeg']);
// return Storage::disk('local')->get('images/avatars/1.jpeg');
// return response()->file(Storage::disk('local')->get('images/avatars/1.jpeg'));
}
字符串
我是这样存储收到的图片的:
Storage::putFileAs('images/avatars/', $request->avatar, $request->accountId, 'private');
型
后端响应处理的js:
let token = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
let myRequest = new Request('/backend/pic');
let myHeaders = new Headers();
myHeaders.append("Accept", "application/json, text-plain, */*");
myHeaders.append("X-Requested-With", "XMLHttpRequest");
myHeaders.append("X-CSRF-TOKEN", token);
myHeaders.append("Content-Type", 'image/jpeg/jpg');
let init = {
method: 'GET',
mode: 'cors',
credentials: 'same-origin',
headers: myHeaders,
};
fetch(myRequest, init).then((response) => {
console.log(response);
return getBody(response);
}).then((data) => {
console.log(data);
createAppendElm('img', {
'src': 'data:image/jpeg;base64,' + btoa(data),
'alt': 'alternative'
}, getElm('box'));
});
function getBody(response) {
const contentType = response.headers.get("content-type");
if (contentType && contentType.indexOf("application/json") !== -1) {
return response.json();
} else {
return response.text();
}
}
型
我的猜测是我的JavaScript没有正确处理响应,所以有什么建议吗?
1条答案
按热度按时间42fyovps1#
我使用了Cloudinary库,它对初学者非常友好,应该不难理解。