通过AJAX发布canvas blob:阻止/删除本地缓存

我正在通过AJAX使用如下方法将canvas图像上传到我的服务器:

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 […]返回表示canvas中包含的图像的Blob对象; 此文件可以缓存在磁盘上,也可以由用户代理自行决定存储在内存中

( https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement )

对于我的程序来说,保留图像非常重要(不是限制,而是作为隐私问题)。 所以我需要知道是否有保证可以删除这个可能的缓存副本,以及何时删除。 还有取消删除程序找到它的潜在风险,所以我想知道我是否可以覆盖数据或以其他方式强制安全删除。

如果可以在不冒本地缓存副本的情况下实现相同的结果,那就更好了。 如果可能的话,加密也是一种选择。

我只关心现代浏览器,专门支持getUserMedia ,所以没有IE(我有一个Flash回退用于处理内存中所有内容的旧浏览器)。

如果隐私和安全性很重要,您应该考虑从canvas而不是Blob对象生成data-uri

由于blob可能会或可能不会临时存储(缓存)在磁盘上,因此文件将受到安全情况的影响(即,如您所述,取消删除 )。 内存文件/字符串当然可以用于内存扫描,但是当从canvas获取图像进行传输时,这就像你将获得“安全”一样接近。

data-uri 通常仅在内存中生成, 通常包含base64编码的图像(如果图像非常大,则仍有将其分页到磁盘的风险)。

*)依赖于实现,例如,如果缺少可用的内存资源,移动浏览器更有可能使用临时文件 – 但是,这种可能的行为没有记录。

要使用data-uri

 canvas.toDataURL(); 

您可以选择指定图像类型(默认为PNG):

 canvas.toDataURL('image/jpeg'); //optional second parameter is quality [0.0, 1.0] 

另一种选择是直接从canvas中提取像素并存储在(类型化的)数组中。 然后可以按原样传输数据,或者可以使用压缩库在发送数据之前压缩到例如zip。

但是,这种方法效率最低。

在所有可能性中,blob被删除时,

  1. 没有引用它(垃圾收集)
  2. 标签/窗口已关闭

在这种情况下,“缓存”并不意味着很长一段时间,而是每次访问时都不会重新计算。

长期缓存内容将浪费存储空间,因为canvas是通过动态设计的。 如果是静态内容,则应使用

我没有看过任何源代码,但这是一个合乎逻辑的结论。 在jQuery停止引用blob之后(当发送请求时),它应该被垃圾收集器拾取并丢弃。


安全删除是非常低级别的,浏览器永远不会允许它。 它基本上是通过写入硬盘驱动器上的特定地址来工作的,这可能会被错误计算并破坏数千个文件(在一个严重碎片化的分区中)。 如果它们将它存储到磁盘上,它将可以通过计算机取证来恢复。