我正在通过AJAX将画布图像上传到我的服务器,使用如下方法:
myCanvas.toBlob( function( blob ) {
var fdata = new FormData( );
fdata.append( 'myFile', blob );
$.ajax( {
url: 'http://myScript.foo',
type: 'POST',
data: fdata,
processData: false,
contentType: false
} );
}, 'image/jpeg', 0.9 );
(感谢https://stackoverflow.com/a/8244082/1180785)
但根据Mozilla的说法,
toBlob
[...]返回表示画布中包含的图像的Blob
对象;此文件可以缓存在磁盘上,也可以由用户代理自行决定存储在内存中
(https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement)
对于我的程序来说,保留图像非常重要(不作为限制,而是作为隐私问题)。所以我需要知道是否有保证可以删除这个可能的缓存副本,以及何时删除。还有取消删除程序找到它的潜在风险,所以我想知道我是否可以覆盖数据或以其他方式强制安全删除。
如果可以在不冒本地缓存副本的情况下实现相同的结果,那就更好了。如果可能的话,加密也是一种选择。
我只关心现代浏览器,特别支持getUserMedia
,所以没有IE(我有一个Flash回退功能,用于处理内存中所有内容的旧浏览器)。
答案 0 :(得分:0)
在所有可能性中,blob都被删除,
在该上下文中,“缓存”并不意味着很长一段时间,而是每次访问时都不会重新计算。
长期缓存内容会浪费存储空间,因为画布是通过动态设计的。如果是静态内容,则应使用<img>
。
我没有看过任何源代码,但这是一个合乎逻辑的结论。在jQuery停止引用blob之后(当发送请求时),它应该由垃圾收集器拾取并丢弃。
安全删除级别非常低,浏览器永远不会允许删除。它基本上通过写入硬盘驱动器上的特定地址来工作,这可能会被误算并破坏数千个文件(在一个严重碎片化的分区中)。如果它们将它存储到磁盘上,它将可以通过计算机取证来恢复。
答案 1 :(得分:0)
如果隐私和安全性很重要,您应该考虑从画布而不是data-uri
对象生成Blob
。
由于blob可能会或可能不会临时存储(缓存)在磁盘上,因此文件将受到安全情况的影响(例如,取消删除)。一个内存文件/字符串当然可以用于内存扫描,但这就像你接近&#34;安全&#34;从画布上获取图像进行传输时。
data-uri
* 仅在内存中生成并且通常包含base64编码的图像(如果您的图像严重很大,它仍有被分页到磁盘的风险。)
*) 依赖于实现,例如如果可用的内存资源很少,移动浏览器更有可能使用临时文件 - 但是,这种可能的行为没有记录。
要改为使用data-uri
:
canvas.toDataURL();
您可以选择指定图像类型(默认为PNG):
canvas.toDataURL('image/jpeg'); //optional second parameter is quality [0.0, 1.0]
另一种选择是直接从画布中提取像素并存储在(类型化的)数组中。然后可以按原样传输数据,或者可以在发送数据之前使用压缩库压缩到例如zip。
然而,这种方法效率最低。