在浏览器中复制到剪贴板 BINARY 数据

Posted

技术标签:

【中文标题】在浏览器中复制到剪贴板 BINARY 数据【英文标题】:Copy to clipboard BINARY data in browsers 【发布时间】:2012-11-30 15:55:27 【问题描述】:

复制到剪贴板功能的最新技术(我的调查)

Flash 替代品

我找到了以下替代方案: Zclip:我们正在使用 zeroclipboard(祖先,zclip 使用它的按钮 flash 电影):只有文本 Clippy:页面中只有文字https://github.com/mojombo/clippy 您可以在 (ActionScript:Flash) 代码中看到:http://code.google.com/p/zeroclipboard/source/browse/trunk/ZeroClipboard.as(第 77 行) 他们使用 System.setClipboard(cliptText) 调用,它只支持纯文本字符串,正如我们在 Adob​​e AIR API 参考中看到的那样:http://help.adobe.com/en_US/air/reference/html/flash/system/System.html 所以我们不能通过 Flash 传递格式化文本。

HTML5 替代

草案中有一个 API 用于标准化剪贴板事件,但目前尚未在任何浏览器中实现 http://dev.w3.org/2006/webapi/clipops/

我的 Rails/Zclip 实现

我正在使用 zclip(基于 zeroclipboard)将文本从 restfule 服务复制到系统剪贴板:

$('.copy-to-clipboard').zclip
  path:'/ZeroClipboard.swf'
  setHandCursor: true
  copy: -> 
    ajaxReturn = $.ajax
     type: 'GET'
     async: false
     url: '/resources/copy_to_clipboard/' + $(this).attr("class").match(/[0-9]+/)
    return ajaxReturn.responseText

这是咖啡脚本。

如果服务 (/resources/copy_to_clipboard/) 提供文本,则它被正确复制。但是,如果它为 DOCX 文件提供服务,它不会直接复制到剪贴板。看看 rails 控制器:

  def copy_to_clipboard
    send_file @resource.resource_content.content.file.file, :type => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
  end

问题

您是否随时解决了将 BINARY 数据复制到剪贴板的问题?以及如何?

谢谢

【问题讨论】:

请注意:剪贴板 JS API 现在 supported 在***浏览器中相当不错。但我不知道这对二进制数据复制有帮助。 @prototype 不确定要求是什么? 也许您可能会考虑here 中描述的允许将文件从服务器拖放到桌面的技术?据说它只能在 chrome 中工作。 我的目标是放置一个带有数据风格“GVML”的 ZIP blob,最终目标是将图表从浏览器复制/粘贴到 Office 作为可编辑对象。 不让网页复制二进制数据是一个可能的安全问题,因为用户不知道内容吗? 【参考方案1】:

我阅读了Clipboard API and events 并编写了以下代码,这对我有用。唯一的问题是使用NULL (0x0) 值。使用代码的方式是使用所需的二进制值设置x 数组并调用document.execCommand('copy') 函数,恭喜您的数据在剪贴板中!

var x = [0x1b, 0x68, 101, 108, 108, 0x6f, 0x7, 0x8];
var button = document.getElementById("copy-button");

button.addEventListener("click", function() 
  document.execCommand('copy');
, false);

document.addEventListener('copy', function(e) 
  var str = '';
  x.forEach(function(d) 
    str += String.fromCharCode(d)
  )
  //You can ignore setting third parameter value
  e.clipboardData.setData('text', str, true);
  console.info('data copied');
  e.preventDefault();
);
<button type="button" id="copy-button">Copy to clipboard</button>

这里是 Notepad++ 中的粘贴结果,带有 Show All Characters 菜单项: 我希望这会有所帮助;)

【讨论】:

以上是关于在浏览器中复制到剪贴板 BINARY 数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript 中复制到剪贴板?

如何在 JavaScript 中复制到剪贴板?

JS--微信浏览器复制到剪贴板实现

js插件zClip实现复制到剪贴板功能

复制到剪贴板不适用于 VueJS 中的 Chrome 浏览器

复制到 jquery/javascript 中的剪贴板,没有 ipad / iphone 的 flash