javascript - 无论 CSP 中有什么,Cordova 都不会获取任何 base64
问题描述
我正在使用 Cordova 的相机插件来允许我的应用程序拍照,但到目前为止还不能让它对返回的数据做任何事情。
我已经放弃尝试从文件系统 URL 加载它,现在正在尝试使用 base64。
我的 CSP 是:
<meta http-equiv="Content-Security-Policy" content="
default-src *;
style-src * 'unsafe-inline';
script-src * 'unsafe-inline' 'unsafe-eval';
media-src *;
img-src * data:;
connect-src * ws: wss:;
" />
...但是我已经尝试了在互联网上可以找到的所有其他 CSP。不管里面有什么,我的控制台总是记录:
“拒绝连接到 'data:image/jpg;base64... 因为它违反了文档的内容安全策略。”,来源: http://localhost:8080/js/main.js ”
有谁知道为什么会这样,或者我将如何解决它?
将图像数据转换为文件的代码是:
navigator.camera.getPicture(response => {
this.urltoFile('data:image/jpg;base64,'+response, 'test.jpg')
.then(file => {
console.log(file);
})
}, () => {}, {
destinationType : navigator.camera.DestinationType.DATA_URL,
})
...urlToFile
功能是:
urltoFile(url, filename){
let mimeType = (url.match(/^data:([^;]+);/)||'')[1];
return (fetch(url)
.then(res => {
return res.arrayBuffer();
})
.then(buf => {
return new File([buf], filename, {
type: mimeType
});
})
);
}
解决方案
根据您的代码,您正在使用 Fetch API 将图片下载为 base64。
查看文档,Fetch API 受到connect-src
指令的限制(重点是我的):
HTTP Content-Security-Policy (CSP)
connect-src
指令限制可以使用脚本接口加载的 URL。受限制的 API 有:
<a> ping
,Fetch
,XMLHttpRequest
,WebSocket
, 和EventSource
.
因此,我们必须通过添加到指令中来更改您connect-src
以接受数据 URL ,如下所示:data:
connect-src * data: ws: wss:;
推荐阅读
- macos-mojave - 为什么在我的 Mac 上安装的版本是 10.15.5 的 xCode 中看到 macOS 11.1?
- codeigniter-3 - 使用 required 和回调函数使用验证表单时出错
- azure - 我需要在使用 PowerShell 创建 Azure VMSS 时指定操作系统磁盘名称
- accelerometer - 如何将原始加速度计数据转换为有关重复运动的信息
- ios - 如何使用我从情节提要添加的页面控件?迅速
- python - 我们可以在异步函数中使用 Flask test_client()
- python - Python 数据框总结
- java - 如何将其从 Scanner 更改为 BufferedReader?
- javascript - 使用 Vue 渲染时加载相同的两个页面
- hadoop - 我可以从 ryzen 5000 系列笔记本电脑连接 hadoop localhost 服务器吗?