PHP経由でダウンロードを強制することで、キャンバスを画像としてダウンロードする仕組みを開発しようとしています。次のコードは Chrome デスクトップでは機能しますが、Android 2.3 ストック ブラウザでは機能しません。
HTML と JavaScript:
<script> function downloadImage()
{
document.getElementById('action').value = 'downloadfile';
document.getElementById('source').value = document.getElementById('finalimage').src;
document.getElementById('user').value = userId;
document.getElementById('imageForm').submit();
}
</script>
<html>
<form id="imageForm" action="" method="post" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="source" id="source" value=""/>
<input type="hidden" name="action" id="action" value="savefile"/>
<input type="hidden" name="user" id="user" value=""/>
</form>
</html>
PHP コード:
<?php
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"colouringbook-page.jpg\"");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
header("Content-transfer-encoding: binary");
$source = $_REQUEST['source'];
$source = base64_decode(substr($source, strpos($source, ",")+1));
header("Content-Length: " . strlen($source));
print $source;
exit;
?>
私が得ている問題は、まず「ダウンロードに失敗しました」です。その後、ダウンロードに成功すると、イメージが破損します。
[アップデート]
ブラウザに出力して、そこから画像を保存しようとしてテストしています。画像が表示されていますが、画像を保存する際のファイル命名スキームは *.html です
Androidストックブラウザのバグである可能性があるようです。画像をサーバーに保存できましたが、そこからバッファを出力して画像をダウンロードできませんでした。通常のhtmlタグを出力してから、Androidで「名前を付けて保存」して画像をダウンロードする必要がありました。