0

我有一个图像的 base64 编码字符串。它从另一个站点传给我,其中iframe的数据来自postMessage. 我知道这听起来很可怕,但由于我无法控制的原因,这是一个我无法解决的集成。

我正在尝试在 PHP 测试文件中进行概念验证。

我有这样的代码:

<div id="binary"><?=$file;?></div>
<script type="text/javascript">
var oReq = new XMLHttpRequest();
oReq.open("POST", "/endpoint.php", true);
oReq.setRequestHeader("Content-Type","application/octet-stream");
oReq.setRequestHeader("X-File-Name","abc.jpg");
oReq.setRequestHeader("X-Requested-With", "XMLHttpRequest" );
// This fails whether or not 'binary' is base64-encoded and decoded here
// or when `binary` is already actually binary
oReq.send(document.getElementById( 'binary' ).innerHTML );
</script>

$file是文件的实际内容。这在 Firefox 中会出错,但我们只关心这个项目的 Chrome,因为iframe它来自嵌入式 webkit 的实例。

无论如何,这些数据会发送出去,并且由于某种原因总是一个损坏的图像。我还尝试将文件打印成divbase64 编码(实际上是有效的 HTML),然后在发送之前对其进行解码。我只是想不出一个编码/解码/打印的组合来使它在服务器端工作。

我也尝试send通过以下方式更改sendAsBinary

使用 XHR 在 WebKit/Chrome 中上传二进制字符串(相当于 Firefox 的 sendAsBinary)

有任何想法吗?

4

2 回答 2

0

首先,如果可能,不要将文件内容存储在 a <div>(或 DOM 中的任何位置,就此而言)。如果可以的话,最好是这样<script>var myfile="..."</script>。如果你只是必须将它存储在 DOM 中,它肯定是 base64。并且不要innerHTML用于访问内容,textContent而是使用。

其次,我认为在这种情况下您不需要二进制文件,因为您不会(AFAIK)将二进制数据从 iframe 传输到主页,您必须将其编码为字符串( base64 编码),一旦它是一个字符串,就可以安全地将其作为标准值传输,然后在接收端(PHP)对其进行 base64 解码。

编辑:在上面看到您关于需要使其尽可能像普通文件上传的评论。然后我建议这个用例需要一个单独的端点,它只接收 base64 字符串,什么都不做,然后它重新构建文件,然后将它转发到另一个端点。

编辑#2:您可以将文件内容放入画布元素中,然后使用toBlob(). 要将内容放入画布中,您必须首先从您的 base64 编码中创建一个 dataURL(基本上,在您的 base64 内容之前添加“data:image/jpg;base64”),将该 dataURL 指定src<img>,然后drawImage()<img>到你的<canvas>

于 2013-02-26T23:12:52.190 回答
0

我无法通过服务器路由让它工作,所以我最终向服务器传递了一个标志,说“嘿,这是 base64_encoded” 结果并没有太多的返工,所以谢谢@mr.VVoo

于 2013-02-27T02:05:23.650 回答