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考慮します。

とにかく、このデータが送信され、何らかの理由で常に破損したイメージになります。また、ファイルをdivbase64 エンコード (実際には有効な HTML ) に出力し、送信する前にデコードすることも試みました。サーバー側で動作させるエンコード/デコード/印刷の組み合わせを思いつくことができません。

私も次のように変更しようとしsendましたsendAsBinary

XHR を使用して WebKit/Chrome にバイナリ文字列をアップロードする (Firefox の sendAsBinary に相当)

何か案は?

4

2 に答える 2

0

まず、可能であれば、ファイルの内容を<div>(またはDOMのどこにも)保存しないでください。できれば、それが良いでしょう<script>var myfile="..."</script>。単にDOMに保存する必要がある場合は、確かにbase64である必要があります。またinnerHTML、コンテンツへのアクセスには使用せず、textContent代わりに使用してください。

次に、この場合はバイナリは必要ないと思います。バイナリデータをiframeからメインページに(AFAIK)転送しないため、文字列としてエンコードする必要があります( base64エンコーディング)、文字列になったら、それを標準値として送信しても安全です。base64-受信側(PHP)でデコードします。

編集:通常のファイルアップロードとできるだけ同じようにする必要があるという上記のコメントを見ました。次に、このユースケースには、base64文字列のみを受け取り、他に何もしない別のエンドポイントが必要であり、ファイルを再構成してから、他のエンドポイントに転送することをお勧めします。

編集#2:ファイルの内容をcanvas要素に入れてから、を使用してBlobとして戻すことができる場合があります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 に答える